Cuộc tranh chấp Samurai tối thượng


37

Chú ý: Đây thách thức đã hoàn thành. Điều này có nghĩa là dấu kiểm màu xanh lá cây, đã được trao cho C5H8NNaO4 cho mục nhập của họ Người quan sát sẽ không được chuyển đến bất kỳ câu trả lời mới nào.

Bạn vẫn có thể gửi các mục mới, nhưng có thể có sự chậm trễ trong các giải đấu mới đang diễn ra vì tôi không chủ động kiểm tra các mục mới nữa.

Giới thiệu

Trong thử thách này, bạn đang chơi một game arcade có tên The Ultimate Samurai Showdown Ultimate Edition Phiên bản đặc biệt 2.0 X Alpha Omega Turbo (hay gọi tắt là Ultimate Samurai Showdown ). Đối thủ của bạn? Không ai khác ngoài các thành viên khác của Lập trình Câu đố & Code Golf!

Như bạn có thể mong đợi từ một game arcade PPCG, bạn không trực tiếp chơi Ultimate Samurai Showdown mà hãy viết một chương trình sẽ chơi game cho bạn. Chương trình này sẽ chiến đấu chống lại các chương trình được gửi bởi những người dùng khác trong một cuộc đấu tay đôi. Chương trình lành nghề nhất sẽ được trao vương miện Samurai tối cao của PPCG, và được cấp dấu tích xanh của huyền thoại.

Mô tả trò chơi

Phần này mô tả các cơ chế đằng sau trò chơi.

Điều kiện chiến thắng

Một trận đấu bao gồm hai samurai đối đầu với nhau. Mỗi samurai bắt đầu mỗi trận đấu với 20 điểm nhấn và 1 danh dự . Một samurai chiến thắng nếu đối thủ của anh ta chết và anh ta vẫn còn sống. Có hai phương pháp mà một samurai có thể chết:

  1. Nếu điểm trúng của samurai bị hạ xuống 0, anh ta sẽ chết.
  2. Nếu một samurai mang danh dự của riêng họ xuống dưới 0, anh ta sẽ bị các vị thần đánh gục vì hành động không trung thực trong một cuộc đấu tay đôi.

Bị các vị thần hạ gục có mức độ ưu tiên cao hơn so với việc bị giảm điểm xuống 0, do đó, trong trường hợp một samurai ở 0 điểm và người còn lại ở -1 danh dự, samurai có 0 điểm máu sẽ giành chiến thắng. Trong tình huống cả hai samurai đều ở -1 danh dự, cả hai đều bị các vị thần đánh gục và trò chơi là một trận hòa.

Một trận đấu bao gồm tới 500 lượt . Nếu tất cả 500 lượt đi qua và trận đấu chưa được quyết định (cả samurai đều không chết), các vị thần trở nên buồn chán và hạ gục cả hai samurai, do đó dẫn đến kết quả hòa.

Hành động

Trên mỗi lượt, samurai phải thực hiện chính xác một trong các hành động sau:

W

Các samurai sẽ chờ đợi và thực hiện không có hành động. Điều này làm cho anh ta trông ngầu nhưng không giúp anh ta đánh bại đối thủ của mình. Đây cũng là hành động mặc định.

B

Các samurai sẽ cúi đầu trước đối thủ của mình một cách danh dự. Điều này làm hài lòng các vị thần và do đó, samurai sẽ nhận được 1 Danh dự. Danh dự rất quan trọng đối với thành công của samurai của bạn vì Honor thực chất là "tài nguyên" cho trò chơi này - tất cả các động thái tách rời BWcó thể làm giảm Danh dự. Ngoài ra, nếu một samurai đạt được 7 Danh dự trở lên, anh ta được phép sử dụng Thanh kiếm của các vị thần . Ý nghĩa của việc này được mô tả dưới đây.
Tuy nhiên, cúi đầu trước đối thủ khiến bạn bỏ ngỏ nếu đối thủ quyết định tấn công bạn bằng thanh kiếm của anh ta, vì vậy hãy cẩn thận khi bạn chọn cúi đầu.

G

Các samurai sẽ vào một vị trí phòng thủ và bảo vệ chống lại bất kỳ cuộc tấn công bằng kiếm nào. Chiêu thức này sẽ chặn thành công tất cả các đòn tấn công bằng kiếm, ngay cả những đòn được thực hiện bằng Thanh kiếm của các vị thần .
Tuy nhiên, các vị thần cau mày với một samurai phòng thủ quá mức, do đó, hành động này sẽ tiêu tốn 1 Honor nếu hành động của samurai ở lượt trước ngay lập tức cũng được bảo vệ. Nó không tiêu thụ Honor khác.

I

Các samurai sẽ cố gắng tấn công đối thủ của mình bằng một thanh kiếm rút nhanh từ bao kiếm. Nếu samurai có 7 Honor trở lên, anh ta sẽ sử dụng Thanh kiếm của các vị thần thay vì thanh kiếm thông thường của mình. Động thái này tiêu tốn 1 Honor.
Trận hòa nhanh là một cuộc tấn công nhanh sẽ đánh bại các cuộc tấn công trên không chậm hơn, tuy nhiên, nó sẽ thua trước các trận đấu. Nếu đòn tấn công kết nối thành công, nó sẽ gây 1 sát thương, hoặc 2 sát thương với Thanh kiếm của các vị thần .

P

Các samurai sẽ cố gắng ngăn chặn mọi cuộc tấn công sắp tới, sau đó tiến hành cuộc tấn công của chính mình. Nếu samurai có 7 Honor trở lên, anh ta sẽ sử dụng Thanh kiếm của các vị thần thay vì thanh kiếm thông thường của mình. Động thái này tiêu tốn 1 Honor.
Parry là một cơ động tốt chống lại các cuộc tấn công nhanh, nhưng nó sẽ bị áp đảo bởi các cuộc tấn công trên không chậm hơn. Nếu đòn tấn công kết nối thành công, nó sẽ gây 1 sát thương, hoặc 2 sát thương với Thanh kiếm của các vị thần .

O

Các samurai sẽ cố gắng tấn công đối thủ của mình bằng một cuộc tấn công trên cao chậm hơn. Nếu samurai có 7 Honor trở lên, anh ta sẽ sử dụng Thanh kiếm của các vị thần thay vì thanh kiếm thông thường của mình. Động thái này tiêu tốn 1 danh dự.
Cuộc đình công trên cao có thể áp đảo các cuộc diễu hành, nhưng nó sẽ thua trước các cuộc đình công nhanh. Nếu đòn tấn công kết nối thành công, nó sẽ gây 1 sát thương, hoặc 2 sát thương với Thanh kiếm của các vị thần .

Thanh kiếm của các vị thần

Một samurai có Danh dự từ 7 trở lên sẽ có khả năng sử dụng Thanh kiếm của các vị thần . Nếu Danh dự của anh ta bị giảm xuống dưới 7, khả năng sử dụng Thanh kiếm của các vị thần sẽ bị thu hồi từ anh ta. Các Sword of the Gods đề 2 thiệt hại thay vì 1.

Các Sword of the Gods không cho phép một cuộc tấn công để đánh bại một cuộc tấn công thanh kiếm mà nó sẽ không thường đánh bại. Chẳng hạn, một parry của Sword of the Gods vẫn sẽ thua một đòn tấn công trên không thông thường, và một trận hòa nhanh chóng của Sword of the Gods sẽ không áp đảo một trận hòa nhanh chóng thông thường. Thật vậy, cái gọi là Thanh kiếm của các vị thần thực sự không mạnh đến thế - có lẽ đó là một trò đùa vũ trụ được chơi bởi các vị thần ...

Bảng tương tác

Đoạn trích dưới đây chứa một bảng liệt kê rõ ràng tất cả các kết quả có thể có của các kết hợp hành động khác nhau mà hai samurai có thể thực hiện. Để xem nó, nhấp vào "Hiển thị đoạn mã", sau đó nhấp vào "Chạy đoạn mã".

Chương trình truyền thông

Để tạo điều kiện cho hoạt động của giải đấu, một chương trình điều khiển đã được viết để đóng vai trò của các "vị thần" - nó giữ các hồ sơ về danh dự và sức khỏe và đánh bật samurai theo đó. Phần này mô tả cách chương trình của bạn sẽ giao tiếp với chương trình điều khiển.

Mô tả đầu vào

Chương trình điều khiển sẽ gọi chương trình của bạn từ dòng lệnh như thế này:

<command> <history> <enemy_history> <your_health> <enemy_health> <your_honour> <enemy_honour>

Ở đâu:

  • <command>là lệnh cần thiết để chạy chương trình của bạn. Ví dụ, nếu chương trình của bạn nằm trong một tệp super_sentai.pl, lệnh có thể là perl super_sentai.pl.

  • <history>là một lịch sử của các động thái mà bạn thực hiện. Chẳng hạn, WWBPcó nghĩa là bạn đã đợi hai lần, cúi đầu một lần và khóc một lần.

  • <enemy_history>là một lịch sử di chuyển kẻ thù của bạn thực hiện. Ví dụ, BBBIcó nghĩa là kẻ thù của bạn cúi đầu ba lần và thực hiện một trận hòa nhanh chóng.

  • <your_health> là sức khỏe hiện tại của bạn.

  • <enemy_health> là sức khỏe hiện tại của kẻ thù.
  • <your_honour> là vinh dự hiện tại của bạn.
  • <enemy_honour> là vinh dự hiện tại của kẻ thù.

Đối với lượt đầu tiên, historyenemy_historysẽ trống, vì vậy chương trình của bạn sẽ chỉ được gọi với bốn đối số cuối cùng như thế này:

<command> <your_health> <enemy_health> <your_honour> <enemy_honour>

Hãy chuẩn bị cho việc này!

Độc giả sắc sảo có thể nhận thấy rằng bốn lý lẽ cung cấp danh dự và sức khỏe của cả hai samurai, ở một mức độ nào đó, là thừa thãi; vì đây là một trò chơi thông tin hoàn hảo, danh dự và sức khỏe của samurai có thể được xác định chỉ bằng cách sử dụng lịch sử.

Các giá trị này được cung cấp cho mục đích thuận tiện để bạn không phải phân tích các đối số lịch sử. Điều này sẽ hữu ích khi thực hiện các chiến lược đơn giản, chẳng hạn như không tấn công khi Danh dự của bạn bằng 0.

Mô tả đầu ra

Để chọn một hành động, chương trình của bạn nên đầu ra một trong những W, B, G, I, P, hoặc Ođể đầu ra tiêu chuẩn, tùy thuộc vào những hành động bạn muốn thực hiện. Nếu chương trình của bạn không xuất ra bất cứ thứ gì trong vòng 1000ms, nó sẽ bị chấm dứt và chương trình của bạn sẽ được xử lý như thể nó xuất ra W.

Nếu chương trình của bạn xuất ra nhiều hơn một chữ cái, chỉ chữ cái đầu tiên sẽ được xem xét - vì vậy việc xuất ra Parrysẽ giống như xuất ra P.

Nếu đầu ra của chữ cái đầu tiên của chương trình của bạn không phải là bất kỳ tùy chọn nào được liệt kê ở trên, nó sẽ mặc định W.

Định dạng gửi

Gửi một chương trình như một câu trả lời cho bài viết này. Bạn có thể gửi nhiều chương trình. Nếu bạn đang gửi nhiều chương trình đơn giản, tôi khuyên bạn nên gửi chúng dưới dạng một câu trả lời duy nhất; nếu bạn đang gửi nhiều chương trình phức tạp, tôi khuyên bạn nên gửi chúng dưới dạng câu trả lời riêng biệt. Khi tôi đã thêm thành công chương trình của bạn vào giải đấu, tôi sẽ cam kết với kho git với mục nhập của bạn (được liên kết bên dưới).

Nếu tôi gặp phải sự cố khiến chương trình của bạn không được thêm vào giải đấu, tôi sẽ để lại nhận xét về mục nhập của bạn cho biết sự cố.

Vui lòng bao gồm những điều sau đây trong trình của bạn:

  1. Tên người có thể đọc được của chương trình của bạn, để sử dụng trong bảng điểm. Không gian được phép ở đây; dấu phẩy và ký tự Unicode thì không.
  2. Ngôn ngữ mà chương trình của bạn được viết. Vui lòng tránh viết bằng các ngôn ngữ lạ, khó truy cập như TinyMUSH.
  3. Một bản tóm tắt ngắn của chương trình của bạn. Đây có thể là một mô tả về cách chương trình hoạt động, hoặc chỉ một số văn bản hương vị về chương trình của bạn (nếu bạn muốn tất cả bí mật), hoặc có lẽ cả hai.
  4. Các lệnh / s cần thiết để chạy chương trình của bạn. Chẳng hạn, nếu bạn đang viết bài nộp của mình bằng Java được gọi example.java, bạn sẽ cung cấp các hướng dẫn biên dịch javac example.javasau đó chạy các hướng dẫn java example.
  5. Mã nguồn của chương trình.

Để hỗ trợ việc gửi, tôi cung cấp một mẫu đệ trình có thể tìm thấy ở đây . Các mẫu làm cho đệ trình trông đẹp hơn. Tôi rất khuyến khích sử dụng nó.

Tôi cũng cung cấp hai mục ví dụ. Mặc dù các mục ví dụ sẽ tham gia vào vòng tròn, mục đích chính của chúng là làm rõ các định dạng đệ trình và đầu vào / đầu ra cho giải đấu, thay vì là ứng cử viên nặng ký cho danh hiệu Ultimate Samurai.

Cơ cấu giải đấu

Phần này mô tả cách giải đấu giữa những người tham gia sẽ được điều hành.

Chương trình điều khiển

Chương trình điều khiển được viết bằng Python 2 và có thể được tìm thấy trên kho lưu trữ Ultimate Samurai Showdown Github . Nếu bạn muốn tự chạy nó, hướng dẫn về cách chạy nó được bao gồm trong tệp README.md trong liên kết. Tuy nhiên, chỉ các giải đấu chạy trên máy tính của tôi mới là chính thức để tránh sự khác biệt về phần cứng ảnh hưởng đến kết quả giải đấu.

Chương trình điều khiển sẽ được chạy trên máy tính xách tay chạy Arch Linux. Nó có bộ xử lý Intel Core i7 và RAM 8GB. Tôi sẽ nỗ lực để có được tất cả các mục chạy trên máy tính của mình, nhưng tôi sẽ đánh giá cao nó nếu bạn tránh các ngôn ngữ không thể truy cập tự do (như không mất chi phí tiền tệ).

Hệ thống chấm điểm

Hệ thống tính điểm là một vòng tròn. Mỗi chương trình sẽ chơi tám trận đấu với mọi chương trình khác. Một chiến thắng cho chương trình 1 điểm, thua không có điểm và rút 0,5 điểm. Chương trình có số điểm cao nhất sẽ thắng trò chơi. Nếu có một trận hòa, tôi sẽ đấu hai chương trình hàng đầu với nhau để xác định người chiến thắng.

Số lần mỗi chương trình sẽ chơi với nhau chương trình có thể giảm từ 8 nếu có số lượng người đăng ký cực kỳ lớn. Tôi sẽ thêm một lưu ý ở đây nếu điều này xảy ra.

Tôi sẽ chạy vòng tròn nhiều lần vì các bài nộp mới được đăng, nhưng đó chỉ là vòng thi gần đây nhất sẽ được tính.

Truất quyền thi

Có thể chương trình của bạn bị loại khỏi giải đấu. Truất quyền có thể xảy ra nếu:

  • Chương trình của bạn không biên dịch hoặc chạy;
  • Chương trình của bạn là một bản sao chiến lược của một chương trình khác (nghĩa là, nó thực hiện chiến lược chính xác giống như một chương trình khác);
  • Chương trình của bạn cố gắng phá hoại các chương trình khác bằng cách sửa đổi mã điều khiển, mã chương trình khác, v.v;
  • Chương trình của bạn cố gắng khai thác một lỗi trong mã điều khiển. Thay vì khai thác lỗi, thay vào đó bạn nên mở một vấn đề trong kho git, hãy bình luận ở đây hoặc ping tôi trong trò chuyện.

Kết quả trong quá khứ

Kết quả chi tiết của tất cả các giải đấu được cung cấp tại trang wiki .

Giải đấu gần đây nhất đã được hoàn thành vào 2015/07/17 07:20. Dưới đây là một bản tóm tắt các kết quả:

The Observer: 209.0
Coward: 203.0
Monk: 173.0
Elephant Warrior: 157.0
Iniqy: 157.0
Agent 38: 144.0
Ninja: 138.0
Meiyo Senshi: 138.0
Kakashi: 136.0
Yoshimitsu: 131.0
Hermurai: 121.0
Warrior Princess: 120.0
Gargoyle: 119.5
The Honourable: 119.0
Hebi: 118.5
Predictor: 116.0
Whack-a-mole: 107.0
The Fool: 106.0
The Prophet: 105.0
Copy-san: 97.0
YAGMCSE: 80.0
The Waiter: 66.0
Swordsman: 43.0
Spork Holder: 32.5
Blessed Samurai: 27.5
Attacker: 27.0
The Terminator: 17.0
Master Yi: 16.0

1
Người phục vụ đang làm tốt đáng ngạc nhiên. Phải giành chiến thắng trước Spork Holder khi hết danh dự.
StephenTG

Đây là một thử thách gọn gàng. Bạn rõ ràng đặt rất nhiều suy nghĩ và công việc vào đây, và tôi nghĩ rằng nó chắc chắn đã được đền đáp. Công việc tuyệt vời. :)
Alex A.

1
@ C5H8NNaO4 Có, tôi sẽ kiểm tra cập nhật cho bot trước khi tôi chạy giải đấu tiếp theo.
absinthe

1
Thông báo: Máy tính xách tay của tôi bị hỏng gần đây. Vì vậy, tôi không có cách nào để điều hành giải đấu trong tương lai gần. Sẽ có sự chậm trễ trong việc điều hành giải đấu tiếp theo khi tôi cố gắng tìm một máy tính mà tôi có thể sử dụng.
absinthe

1
@Levi Vâng! Các nhà sản xuất vận chuyển cho tôi một sự thay thế mà đến ngày hôm nay. Có một giải đấu đang diễn ra như chúng ta nói.
absinthe

Câu trả lời:


8

Nhà sư (Java)

Nhà sư coi trọng danh dự và ca ngợi các phước lành của Thần. Được rèn luyện sự kiên nhẫn, anh bình tĩnh gửi lời cầu nguyện lên thiên đàng cho đến khi anh cảm thấy được Chúa ưu ái.

Tận hưởng cuộc sống của mình, anh cố gắng bảo vệ nó. Khi anh ta mất sức khỏe ở một tỷ lệ nhất định, anh ta tự bảo vệ mình tốt nhất có thể.

Hy vọng sự hỗ trợ của các vị thần của mình, anh ta ngẫu nhiên gửi xuất tinh [1] lên thiên đàng, nếu không anh ta chiến đấu hết sức có thể.

Nếu đối thủ của anh ta bị kiệt sức trong trận chiến, anh ta kết liễu anh ta bằng cách sử dụng danh dự còn lại của mình để cho anh ta một cái chết nhanh chóng và không đau đớn.

Biên dịch / chạy

javac Monk.java
java Monk

public class Monk {
    public static void main(String[] args){
        char  r = 'B';
        double  s = Math.random ();
        int n = Math.max (args [0].length ()- 8, 1);
        int p = args.length > 4 ? Integer.parseInt (args [4]):0;
        int l = Integer.parseInt (args [3]);
        int m = Integer.parseInt (args [2]);
        double d = 1 + (20 - m) / n;
        double e = 1 + (20 - l) / n;

        if (((p>8&&s<.7)||l<11||m<2)&&p>0) {
                r=(s<(.14)||d>=2||e/d<.618)?'G':"OPI".charAt((int)(Math.random()*3));
        }

        System.out.print (r);
    }
}

Ninja (Java)

Ninja rất nhanh và tấn công thậm chí còn nhanh hơn. Anh ta tấn công ngay sau một lời chào chính thức thân thiện, khiến kẻ thù bối rối hơn bằng cách cúi đầu trước và sau mỗi cuộc tấn công.

Khi được ban phước, ninja tiếp tục hành vi này, chờ đợi đối thủ của mình thực hiện bước di chuyển đầu tiên. Nhân cơ hội này, anh ta tung ra một loạt vụ nổ, được Nữ thần ninja ban phước cho đến khi anh ta quá mệt mỏi trong trận chiến. Sử dụng danh dự còn lại của mình, anh ta trốn dưới những chiếc lá bên dưới, bảo vệ mình khỏi cuộc tấn công tiếp theo. Anh ta nhảy ra và tấn công kẻ thù của mình từ phía sau, lại bị ẩn giấu nhanh chóng.

Nếu anh ta nhận được một vết thương chí mạng, anh ta sẽ ra đi để cùng đối thủ sống với anh ta - tất nhiên, giữ một mô hình danh dự.

javac Ninja.java
java Ninja

public class Ninja {
    public static void main(String[] args){
        char  r = 'B';
        int n = args [0].length ();
        int p = args.length > 4 ? Integer.parseInt (args [4]):0;
        int m = Integer.parseInt (args [2]);
        int a = n % 3;
        if (p>7) {
           if (m>17) {
                r = "BBI".charAt (a);
           } else if (m>13) {
                r = "BII".charAt (a); 
           } else {
               r  = "GIG".charAt (a);
           }

        } else if (p>0) {
           if (m > 10) {
                    r = "BBI".charAt (a);
           } else {
                r="IGI".charAt (n%2);
           }
        }
        System.out.print (r);
    }
}

Kakashi, Ninja Copycat (Java)

Kakashi sao chép đối thủ của mình di chuyển bằng cách chọn ngẫu nhiên giữa hai lần di chuyển cuối cùng mà đối thủ thực hiện. Nếu đối thủ chờ đợi, anh ta cúi đầu - Anh ta cũng giữ danh dự của mình.

javac Kakashi.java
java Kakashi

public class Kakashi {
    public static void main(String[] args){
        char  r;
        String h = args [1];
        if (h=="W" || Integer.parseInt ( args.length > 4?args [4]:"0") < 1){
                 r = 'B';
        } else if (Math.random ()<.1) {
            r = 'I';
        } else {
            r  = h.charAt ((int) (h.length()==1?0: h.length()-Math.random ()*2));
        }

        System.out.print (r);
    }
}


Tôi ước Kakashi có thể được ban phước với Sharingan .. Tôi nghĩ về việc đọc cast.txt. Mô phỏng mọi vòng trong lịch sử của anh ấy chống lại mọi đối thủ trong đó. Cố gắng tìm ra đối thủ mà anh ta chiến đấu bằng cách so sánh lịch sử kẻ thù mô phỏng với lịch sử kẻ thù thực sự. Sau đó sử dụng thông tin đó để dự đoán động thái tiếp theo mà đối thủ sẽ làm và chọn cách đối phó tốt nhất từ ​​danh sách được xác định trước. Nhưng tôi cảm thấy điều này có thể mất một chút vì hiện tại tôi có Internet siêu chậm và không có kỹ năng Java

Người quan sát, (node.js)

Người quan sát cúi đầu trước khi cố gắng dự đoán nước đi tiếp theo của đối thủ từ 5 bước di chuyển vừa qua, chọn đối tác tốt nhất cho nước đi được dự đoán.

Chỉnh sửa: Cảm ơn @apsillers đã chia sẻ bản tóm tắt của node.js!.

node observer.js

var argv = process.argv;
var history = argv.length>6?argv[2]:"";
var enemyHistory = argv.length>6?argv[3]:"";
var offset = 8 - argv.length;
var my = { health:+argv[4-offset], honor:+argv[6-offset], history:history };
var enemy = { health:+argv[5-offset], honor:+argv[7-offset], history:enemyHistory };
my.godSword = my.honor >= 7;
enemy.godSword = enemy.honor >= 7;
function decide() {
    process.stdout.write(arguments[Math.floor(arguments.length*Math.random())]);
    process.exit();
}

var m = {
    m:{},
    l:function (a,b) {
        if (!this.m[a]) {
           this.m [a] = [];
        }
        this.m[a].push (b);
    },
    p:function (a) {
       for (var k=0;k<a.length;k++)
       for (var j=1;j<a.length;j++)
       for (var i=-1+k; i<a.length-j; i++)this.l (a.slice (i,i+j),a[i+j]);
    },
    a:function (a) {
      if (!this.m[a])return;
      return this.m[a][0|Math.random () * this.m[a].length-1]
    }
}
var g={
   B:"IPO",
   G:"B",
   I:"PG",
   O:"IG",
   P:"OG",
   W:"I"
}
var c,i=0;
m.p(enemy.history);
while (!c && i++<enemy.history.length) {
   c=m.a (enemy.history.slice (i));
}
decide.apply  (0,my.honor < 7?["B"]:g[c].split (''))

Chỉnh sửa: Tôi có một lỗ hổng lớn trong người quan sát, tôi thực sự không biết những gì tôi nghĩ tối hôm qua. Có vẻ như anh ta chỉ nhìn vào hai động tác vừa qua của kẻ thù. Anh ấy đã làm tốt đáng ngạc nhiên như thế này.

Trí nhớ của anh giờ đã được truy vấn cho phần dài nhất (cuối) của lịch sử kẻ thù mà anh đã thấy. Điều này chứa một mảng với tất cả các di chuyển theo lịch sử của các di chuyển. Một được chọn ngẫu nhiên. Vì vậy, nếu một di chuyển theo sau thường xuyên hơn, nó cũng có nhiều khả năng được chọn. Loại giống như chuỗi markov.

Người quan sát, bây giờ là bảo vệ.


[1]: TIL: xuất tinh có ý nghĩa tôn giáo


Bạn là số 1 và số 3 ngay bây giờ! Bot đẹp! :)
apsillers

Chúc mừng chiến thắng với The Observer. Dấu tích màu xanh lá cây bây giờ là của bạn: D
absinthe

7

Meiyo Senshi (Java)

Đến từ khu vực Haijima, người ta không biết nhiều về Meiyo. Họ thường không tham gia vào các trò chơi thể thao, nhưng đã gửi một chiến binh đến trò chơi này để đánh giá các đối thủ của họ.

Tuy nhiên, họ là một nhóm đáng kính, vì vậy bạn có thể yên tâm rằng anh ta sẽ làm cho sự hiện diện của mình được các vị thần biết đến trong thời gian ngắn. Một khi anh ta đã thấy đủ kẻ thù của mình để báo cáo, anh ta sẽ sử dụng các phước lành nhận được để hạ gục đối thủ của mình.

Để biên dịch chạy, đó là cách Java tiêu chuẩn:

> javac MeiyoSenshi.java
> java MeiyoSenshi
public class MeiyoSenshi {
    public static void main(String[] args){
        System.out.print(
                Integer.valueOf(args[args.length<5?0:2])>12 ||
                Integer.valueOf(args[args.length<5?2:4])<1  ?
                "B":
                "IPO".charAt((int)(Math.random()*3))
        );
    }
}

7

Spork Chủ (Ruby)

Spork Chủ cúi đầu ở lượt đầu tiên, sau đó hành động ngẫu nhiên sau đó. Đây là một trong hai mục ví dụ.

Chỉ huy: ruby spork-holder.rb

if ARGV.length == 4
    print "B"
else
    print ["W", "B", "G", "I", "P", "O"].sample
end

Người phục vụ (bash)

Người phục vụ chỉ chờ đợi trên mỗi lượt. Đây là một trong hai mục ví dụ.

Chỉ huy: echo W

Không có mã nguồn cần thiết.


7

Hèn nhát (Node.js)

Tôi là một kẻ hèn nhát / Đó là một phép lạ tôi dám thở
Quá sức / Bởi làn gió mùa hè dịu dàng nhất

  • Kiểm tra BXBXBX/ BBBmẫu để cúi đầu (hoặc đánh bạn) khi bạn cúi đầu.
  • Kiểm tra GXGXGXcác mẫu để cúi đầu khi bạn bảo vệ.
  • Nếu sự dũng cảm ngẫu nhiên của anh ấy vượt qua ngưỡng sợ hãi của anh ấy cho vòng đó, anh ấy sẽ cố gắng để đạt được một cú đánh.
    • Có một thanh kiếm của các vị thần làm cho anh ta dũng cảm hơn.
    • Một đối thủ có Kiếm Thần khiến anh ta sợ hãi hơn.
    • Một đối thủ dẫn đầu ít nhất 5 Sức khỏe trở lên cũng khiến anh ta có chút sợ hãi.
  • Nếu không, anh thay phiên nhau canh gác và cúi đầu.

Nếu bạn muốn viết một bài nộp Node.js , xin vui lòng sử dụng mã soạn sẵn của tôi; tất cả mọi thứ cho đến bao gồm cả decidechức năng là hoàn toàn chung chung và miễn phí.


node coward.js

var argv = process.argv;
var history = argv.length>6?argv[2]:"";
var enemyHistory = argv.length>6?argv[3]:"";
var offset = 8 - argv.length;
var my = { health:+argv[4-offset], honor:+argv[6-offset], history:history };
var enemy = { health:+argv[5-offset], honor:+argv[7-offset], history:enemyHistory };
my.godSword = my.honor >= 7;
enemy.godSword = enemy.honor >= 7;
function decide() {
    process.stdout.write(arguments[Math.floor(arguments.length*Math.random())]);
    process.exit();
}

var enemyGuards = !!enemy.history.match(/G.G.G.$/);
var enemyBows = !!enemy.history.match(/(B.B.B.$)|(BBB$)/);

// open with a bow
if(!my.history) { decide("B"); }

// enemy will likely bow? Hit them with your super sword! (or bow)
if((!enemy.honor || enemyBows)) {
    if(my.godSword) { decide("P","I","O"); }
    else { decide("B"); }
}

// no point in hitting them if they're going to guard
if(enemyGuards) { decide("B"); }

// calculate bravery level
var braveryLevel = 0.3;
braveryLevel += (my.godSword * 0.2) - (enemy.godSword * 0.2);
braveryLevel -= (enemy.health - my.health > 5) * 0.1;

// if we're feeling brave, hit them
if(Math.random() < braveryLevel && my.honor) { decide("P","I","O"); }

// if we didn't just guard, and we're not feeling brave, cower in fear
if(!my.history.match(/G$/)) {
    decide("G");
}

// if we did just guard, and we're feeling cowardly,
//   if we don't have sword of the gods, bow
//   otherwise, do anything except guard
if(!my.godSword) {
    decide("B");
} else {
    decide("B","P","I","O");
}

1
Đó là một bot khó khăn. Nồi hơi tuyệt vời; Tôi sẽ sử dụng nó ngay lập tức. Cảm ơn đã chia sẻ :)
C5H8NNaO4

6

Whack-a-mol (R)

Tấn công khi kẻ thù có khả năng cúi đầu, bảo vệ khác.

args <- commandArgs(TRUE)
L <- length(args)
my_health <- as.integer(args[L-3])
enemy_health <- as.integer(args[L-2])
my_honour <- as.integer(args[L-1])
enemy_honour <- as.integer(args[L])
if(L>4){enemy_history <- args[L-4]}else{enemy_history <- ""}
if(my_honour<1){
    out <- "B"
}else if (enemy_honour<=1 | grepl("BB$",enemy_history)){
    out <- sample(c("I","O"),1)
}else{
    out <- "G"
}
cat(out)

Chạy bằng cách sử dụng Rscript Whack-a-mole.R.


1
Công việc tốt, cộng với tôi yêu cái tên này.
Alex A.

3

Chiến binh voi (Java)

Chiến binh voi là từ một thời gian cũ, tự nhiên hơn. Ông đã nhìn thấy nhiều, và nhớ tất cả. Anh ta có thiện cảm với các vị thần trong khi anh ta kiểm tra đối thủ của mình, và sau đó một khi anh ta đưa họ vào trái tim anh ta, anh ta tách họ ra.

Biên dịch: javac ElephantWarrior.java
Lệnh:java ElephantWarrior

import java.util.LinkedList;

//Elephants never forget
class ElephantWarrior
{


  static LinkedList<Choice> analysis = new LinkedList<Choice>();

  public static void main(String[] args){
      if(args.length < 6){ respond("B");}   
      String myhis = args[0];
      String enHis = args[1];
      int health = Integer.parseInt(args[2]);
      int enHealth = Integer.parseInt(args[3]);
      int honour = Integer.parseInt(args[4]);
      int enHonour = Integer.parseInt(args[5]);

        //Bow a few times until I know how he operates
        if(enHis.length() <= 5){
            respond("B");
        }

        //Special cases
        //If I'm at 0 honor, better bow
        else if(honour <= 0){
            respond("B");

        }
        else{
          analyze(enHis);

          //Narrow it down to applicable choices
          char hisLast = enHis.toCharArray()[enHis.toCharArray().length - 1];
          LinkedList<Choice> hisOptions = new LinkedList<Choice>();
          for(Choice c: analysis){
              if(c.pattern.toCharArray()[0] == hisLast){
                  hisOptions.add(c);
              }
          }

           //Default to assuming they bow
          char hisNext = 'B';
          int mostLikely = 0;

          //What will they do next?
          for(Choice c : hisOptions){
              if(c != null && c.probability > mostLikely){
                  //System.out.println("Option = " + c.pattern);
                  //System.out.println("Prob = " + c.probability);
                  mostLikely = c.probability;
                  hisNext = c.pattern.toCharArray()[1]; }
          }

          //Now go through potential case
          switch(hisNext){
              case 'W':
                  respond("I");
                  break;
              case 'B': 
                  respond("O");
                  break;
              case 'G':
                  respond("B");
                  break;
              case 'I':
                  if(enHonour  > 0){
                      respond("P");
                  }
                  else{
                      respond("B");
                  }
                  break;
              case 'P':
                  respond("O");
                  break;
              case 'O':
                  respond("I");
                  break;
              default:
                  respond("G");
          }
        }
    }





      static void analyze(String his){

        //Keep track of his previous moves
        char[] shortString = his.substring(1,his.length() - 1).toCharArray();
        char[] longString = his.toCharArray();
        for( int i = 0; i < shortString.length; i++) {
          String pattern = "" + longString[i] + shortString[i];
          boolean exists = false;
          for(Choice c : analysis){
              if(c.pattern.equals(pattern)){
                  exists = true;
                  c.probability++;
              }
          }
          if(!exists){
              analysis.add(new Choice(pattern, 1));
          }
        }
      }

      private static void respond(String s){
            System.out.println(s);
            System.exit(0);
        }

    }

class Choice{
        String pattern;
        int probability;

       Choice(String p, int i){
            pattern = p;
            probability = i;
       }
}

2
Tôi đã không kiểm tra điều này, nhưng có vẻ như nó sẽ vượt ra khỏi giới hạn ở lượt đầu tiên, nơi chỉ có bốn args.
Geobits

Phải, đã không nhận ra rằng những thứ đó sẽ không được bao gồm trong tất cả. Tôi đoán rõ ràng là một chuỗi trống không thể được thông qua, cảm ơn!
Cain

@katya Bây giờ đã được sửa, btw, nên được đưa vào giải đấu.
Cain

3

Công chúa chiến binh (Julia)

Đây là thử thách King of the Hill đầu tiên tôi từng tham gia. Hãy xem điều này diễn ra như thế nào.

Công chúa chiến binh ưu tiên tấn công và danh dự, và các khu nghỉ dưỡng để tự bảo quản khi cần thiết. Cô ấy khá háo hức và không bao giờ chờ đợi. Trong một nỗ lực để duy trì sự nhanh nhẹn, cô cũng không sử dụng một cuộc tấn công trên cao.


Lưu dưới dạng warrior-princess.jlvà chạy từ dòng lệnh như vậy:

julia warrior-princess.jl <arguments>

Nếu bạn không có Julia, bạn có thể tải xuống ở đây . Để tránh các vấn đề, phiên bản ổn định mới nhất được khuyến nghị (nghĩa là không phải phiên bản phát triển).


type Samurai
    history::String
    health::Int
    honor::Int
end

A = length(ARGS) < 5 ? ["", "", ARGS] : ARGS

me = Samurai(A[1], int(A[3]), int(A[5]))
opponent = Samurai(A[2], int(A[4]), int(A[6]))


if length(me.history) == 0

    # Always begin the match with an honorable bow
    action = "B"

elseif (!ismatch(r"[OIP]", opponent.history) && me.history[end] != 'G') ||
       (me.health < 2 && me.honor > 0)

    # Guard if the enemy has not yet attacked and I did not previously
    # guard, or if my health is low and my honor is sufficient
    action = "G"

elseif me.honor < 2

    # Bow if I'm low on honor
    action = "B"

elseif opponent.honor >= 7 && opponent.history[end]['B', 'W']

    # Assume the enemy will attack with the Sword of the Gods if they
    # most recently bowed or waited
    action = "I"

else
    action = "P"
end

println(action)

1
Mục nhập KotH đầu tiên của bạn và mục nhập Julia KotH đầu tiên chưa từng có nếu tôi không nhầm: xin chúc mừng!
plannapus

@plannapus Cảm ơn! : D Có lẽ tôi sẽ tạo thói quen từ nó.
Alex A.

3

Gargoyle (Java)

Cố gắng sử dụng các động thái phòng thủ mà không tiêu tốn danh dự.

Vì đó là một mục java:

> javac Gargoyle.java
> java Gargoyle
public class Gargoyle { 
    public static void main(String args[]) {
        if (args.length < 5 || Integer.valueOf(args[4]) > 0) {
            System.out.println("IPO".charAt((int)(Math.random()*3)));
        } else if (args[0].charAt(args[0].length()-1) != 'G') {
            System.out.println('G');
        } else {
            System.out.println('B');
        }
    }
}

3

Kiếm sĩ (C / Java)

Kiếm sĩ cúi đầu trong lượt đầu tiên và bất cứ khi nào anh ta sắp hết danh dự. Sau đó anh ta kiểm tra xem đối thủ đã không cúi đầu hay phòng thủ hay chờ đợi trong lượt trước. Nếu đối thủ không có, có khả năng lớn là anh ta sẽ thực hiện một trong những điều này trong lượt hiện tại và kiếm sĩ do đó tấn công ngẫu nhiên vào đối thủ. Nếu điều này không đúng, anh ta sẽ bảo vệ nếu anh ta không bảo vệ lượt trước. Nếu anh ta có, anh ta cúi đầu để đạt được danh dự.

Phiên bản C:

#include <time.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void print_and_exit(char* str)
{
    puts(str);
    exit(0);
}

int main(int argc, char** argv){

    srand(time(NULL));
    char* attack_moves[]={"I", "P", "O"};
    int random_num = rand() % 3;

    if(argc == 5 || atoi(argv[5]) == 0)
        print_and_exit("B");
    else if(argv[2][strlen(argv[2])-1] != 'B' && argv[2][strlen(argv[2])-1] != 'G' && argv[2][strlen(argv[2])-1] != 'W')
        print_and_exit(attack_moves[random_num]);
    else if(argv[1][strlen(argv[1])-1] != 'G')
        print_and_exit("G");

     print_and_exit("B");
}

Cài đặt GCC (trình biên dịch) và lưu mã vào một tệp có tên lệnh " Swordsman.c " để biên dịch:

gcc Swordsman.c -o Swordsman

Tên thực thi có tên " Kiếm sĩ " sẽ được tạo ra. Chạy bằng cách sử dụng

Swordsman

Phiên bản Java:

public class Swordsman {

    public static void print_and_exit(String str)
    {
        System.out.println(str);
        System.exit(0);
    }
    public static void main(String[] argv) {

        String attack_moves[]={"I", "P", "O"};
        int random_num = (int)(Math.random()*3);

        if(argv.length == 4 || Integer.valueOf(argv[5]) == 0)
            print_and_exit("B");
        else if(argv[2].charAt(argv[2].length()-1) != 'B' && argv[2].charAt(argv[2].length()-1) != 'G' && argv[2].charAt(argv[2].length()-1) != 'W')
            print_and_exit(attack_moves[random_num]);
        else if(argv[1].charAt(argv[1].length()-1) != 'G')
            print_and_exit("G");

         print_and_exit("B");
    }

}

Cài đặt javac (trình biên dịch) và lưu mã vào một tệp có tên lệnh " Swordsman.java " để biên dịch:

javac Swordsman.java

Tập tin lớp có tên " Swordsman . Class " sẽ được tạo. Chạy bằng cách sử dụng

java Swordsman



Kẻ tấn công (Java)

Attacker không quan tâm đến bất cứ điều gì ngoại trừ việc anh ta muốn đối thủ của mình chết. Anh ta ngẫu nhiên tấn công một trong những động tác tấn công và nếu có danh dự thấp, cung tên.

public class Attacker {

    static int position = -1;

    public static void print_and_exit(String str)
    {
        System.out.println(str);
        System.exit(0);
    }
    public static void main(String[] argv) {

        String attack_moves[]={"I", "P", "O"};
        position = (position + 1) % 3;

        if(argv.length != 5 && Integer.valueOf(argv[5]) == 0)
            print_and_exit("B");
        else 
            print_and_exit(attack_moves[position]);
    }

}

Cài đặt javac (trình biên dịch) và lưu mã vào một tệp có tên lệnh " Attacker.java " để biên dịch:

javac Attacker.java

Tập tin lớp có tên " Attacker . Class " sẽ được tạo. Chạy bằng cách sử dụng

java Attacker


Công cụ dự đoán (C / Java)

Dự đoán dự đoán kẻ thù di chuyển. Trong lượt đầu tiên, nó sử dụng một nước đi ngẫu nhiên. Cung nếu danh dự của anh ta thấp, tấn công nếu danh dự của kẻ thù thấp hoặc đã cúi đầu trong lượt trước. Nếu người dự đoán không bảo vệ lượt trước, thì lính gác ở lượt hiện tại. Khác, thực hiện động tác tương tự như kẻ thù đã thực hiện trong lượt trước, với điều kiện là nó không 'W'nằm trong trường hợp đó, cung tên Dự đoán.

Phiên bản C:

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>

void print_and_exit(char* str)
{
    puts(str);
    exit(0);
}

int main(int argc, char** argv){

    srand(time(NULL));
    int random = rand() % 5;
    char* moves[] = {"B", "G", "I", "P", "O"};

    if(argc == 5)
        print_and_exit(moves[random]);

    if(atoi(argv[5]) <= 0)
        print_and_exit(moves[0]);
    if(atoi(argv[6]) <= 0)
        print_and_exit(moves[4]);
    if(argv[2][strlen(argv[2])-1] == 'G')
        print_and_exit(moves[4]);
    if(argv[1][strlen(argv[1])-1] != 'G')
        print_and_exit(moves[1]);

    if(argv[2][strlen(argv[2])-1] != 'W'){
        char buf[2]={0};
        *buf = argv[2][strlen(argv[2])-1];
        print_and_exit(buf);
    }

    print_and_exit(moves[0]);

}

Cài đặt GCC (trình biên dịch) và lưu mã vào một tệp có tên lệnh " Dự đoán " để biên dịch:

gcc Predictor.c -o Predictor

Tên thực thi có tên " Dự đoán " sẽ được tạo. Chạy bằng cách sử dụng

Predictor

Phiên bản Java:

public class Predicator{

    public static void print_and_exit(String str)
    {
        System.out.println(str);
        System.exit(0);
    }

    public static void main(String[] argv){

        int random = (int)(Math.random() * 5);
        String moves[] = {"B", "G", "I", "P", "O"};

        if(argv.length == 4)
            print_and_exit(moves[random]);
        else if(Integer.valueOf(argv[5]) <= 0)
            print_and_exit(moves[0]);
        else if(Integer.valueOf(argv[6]) <= 0)
            print_and_exit(moves[4]);
        else if(argv[2].charAt((argv[2].length())-1) == 'G')
            print_and_exit(moves[4]);
        else if(argv[1].charAt((argv[1].length())-1) != 'G')
            print_and_exit(moves[1]);
        else if(argv[2].charAt((argv[1].length())-1) != 'W'){
                    print_and_exit(""+argv[2].charAt((argv[2].length())-1));
        }
        else
            print_and_exit(moves[0]);
    }
}

Cài đặt javac (trình biên dịch) và lưu mã vào một tệp có tên lệnh " Predicator.java " để biên dịch:

javac Predicator.java

Tập tin lớp có tên " Dự đoán . Lớp " sẽ được tạo. Chạy bằng cách sử dụng

java Predicator


Không chắc chắn hiệu quả của các bot này như thế nào vì tôi không có trình thông dịch python2 để kiểm tra nó.


1
Tôi chưa thử nghiệm điều này (Attacker), nhưng có vẻ như nó sẽ vượt ra khỏi giới hạn ở lượt đầu tiên, nơi chỉ có bốn đối số.
Geobits

Attacker dường như đang cho ArrayIndexOutOfBoundsExceptionlượt ở lượt đầu tiên, khiến nó phải đợi ở lượt đầu tiên. Bên cạnh đó là chức năng.
absinthe

@Katya và Geobits, Đã sửa. Cảm ơn vì đã phát hiện ra nó.
Spikatrix

Khi chạy công cụ dự đoán, tôi nhận được segmentation fault (core dumped)sau vòng 24
C5H8NNaO4

@ C5H8NNaO4 Đã sửa lỗi. Mã cập nhật cho cả ba bot. Nên làm việc tốt bây giờ. Cảm ơn đã chỉ ra điều đó! :-D
Spikatrix

2

Master Yi (Python)

Kẻ ám sát bậc thầy giành được nhiều sự ưu ái trong trò chơi đầu, xây dựng nó cho đến khi anh ta bất khả chiến bại. Cố gắng tấn công khi họ ít mong đợi nhất.

import sys, random

class MasterYi(object):
    def __init__(self):
        self.attack = lambda: random.choice(['I','P','O'])
        self.bow   = "B"
        self.guard = "G"
        self.wait  = "W"
        if len(sys.argv)>6:
            self.hist = sys.argv[1]; self.ohist = sys.argv[2]
            self.hp   = sys.argv[3]; self.ohp   = sys.argv[4]
            self.hon  = sys.argv[5]; self.ohon  = sys.argv[6]
        else:
            self.hist = [];          self.ohist = []
            self.hp   = sys.argv[1]; self.ohp   = sys.argv[2]
            self.hon  = sys.argv[3]; self.ohon  = sys.argv[4]
        self.last  = self.hist  and self.hist[-1]  or "W"
        self.olast = self.ohist and self.ohist[-1] or "W"
        self.oGuarder = len(self.ohist)>4 and self.ohist[-4]==self.ohist[-2]=="G"

    def move(self):
        if self.hon < 1: return self.bow
        if self.olast == "G": return self.attack
        if self.hon > 6:
            if self.oGuarder: return self.bow
            if self.ohon > 6: return self.guard
            if self.ohon < 7: return self.attack
            return self.attack
        if self.ohon > 6: return self.guard
        return self.bow

Yi = MasterYi()
print(Yi.move())

Để chạy: Lưu dưới dạng MasterYi.py

python MasterYi.py <args>

2

Sao chép (C)

Sao chép mọi di chuyển của đối thủ của mình. Chắc chắn anh ấy sẽ thua. Biên dịch:gcc copy-san.c

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {
    if (argc == 5) {
        putchar('B');
    } else {
        char *enemy_hist = argv[2];
        size_t len = strlen(enemy_hist);
        putchar(enemy_hist[len - 1]);
    }
    putchar('\n');
    return 0;
}

2

Hebi (Java)

Hebi đi theo con đường của con rắn.

Con rắn không cần sự phù hộ của các vị thần.

Con rắn trượt dốc tấn công; giống như những con sóng trên bãi biển, những gì xảy ra trong quá khứ trở lại.

Con rắn không bao giờ chờ đợi.

Con rắn không có ý thức về sự thông minh, mặt khác nó đã được viết bằng Python.

Hướng dẫn chạy:

> javac hebi.java
> java hebi

Cơ quan mã:

public class hebi{

    public static void main(String args[]){

        if( (args.length < 5) || (args[0].length() % 18 == 0) ) System.out.println( "IPO".charAt((int)(Math.random()*3)) );
        else{

            int hist_size = args[0].length();

            if      (hist_size % 3 == 1) System.out.println("G");
            else if (hist_size % 3 == 2) System.out.println("B");
            else{

                if     (hist_size % 18 ==  9) System.out.println(args[0].charAt(hist_size -  3));
                else if(hist_size % 18 == 12) System.out.println(args[0].charAt(hist_size -  9));
                else if(hist_size % 18 == 15) System.out.println(args[0].charAt(hist_size - 15));
                else{

                    char move_head = args[0].charAt( (hist_size / 18) * 18 );
                    char move_mid;
                    if( hist_size % 18 == 3 ){
                        if     ( move_head == 'I' ) move_mid = "PO".charAt((int)(Math.random()*2));
                        else if( move_head == 'O' ) move_mid = "IP".charAt((int)(Math.random()*2));
                        else                        move_mid = "OI".charAt((int)(Math.random()*2));
                        System.out.println(move_mid);
                    }
                    else{
                        move_mid = args[0].charAt( ((hist_size / 18) * 18) + 3 );
                        char move_tail;

                        if( move_head == 'I' ){
                            if( move_mid == 'P' ) move_tail = 'O';
                            else                  move_tail = 'P';
                        }else if( move_head == 'P' ){
                            if( move_mid == 'O' ) move_tail = 'I';
                            else                  move_tail = 'O';
                        }else{
                            if( move_mid == 'I' ) move_tail = 'P';
                            else                  move_tail = 'I';
                        }

                        System.out.println( move_tail );

                    }

                }

            }

        }

    }

}

2

Danh dự (Java)

Các giá trị danh dự danh dự trên hết. Đó là, danh dự của anh ấy trên tất cả mọi người khác. Nếu samurai kẻ thù có danh dự lớn hơn hoặc bằng, anh ta cúi đầu. Không ai được tôn vinh hơn anh. Nếu không, anh ta làm một động tác ngẫu nhiên. Anh ta không bao giờ bảo vệ hai lần liên tiếp - điều đó sẽ không trung thực!

để biên dịch:

> javac TheHonourable.java
> java TheHonourable

Nguồn:

public class TheHonourable {
    public static void main(String[] args) {
        char move;

        if (args.length < 5) {
            move = 'B';
        } else if (Integer.valueOf(args[5]) >= Integer.valueOf(args[4])){
            move = 'B';
        } else {
            move =  (args[0].endsWith("G")) ?
                    "IPO".charAt((int)(Math.random()*3)) :
                    "GIPO".charAt((int)(Math.random()*4));
        }

        System.out.print(move);
    }
}

1

Samurai may mắn (Python)

Samurai này cố gắng giữ sự ưu ái của các vị thần càng lâu càng tốt. Anh ta vội vã lấy thanh kiếm thánh, sau đó xen kẽ giữa Bảo vệ và Tấn công bằng một trong những cuộc đình công, khôi phục danh dự khi cần thiết. Nếu có vẻ như anh ta hoặc đối thủ của anh ta có thể sớm gục ngã, anh ta lao vào giết chết. Anh ta sẽ dễ dàng rơi vào một kẻ thù có thể theo dõi mô hình của mình, nhưng chiến lược của anh ta luôn luôn tấn công ở hai sát thương nên khá hiệu quả.

import sys
import random
class BlessedSamurai(object):
    def __init__(self):
        if len(sys.argv) < 7:
            print("B")
        else:
            self.attack = ['O', 'I', 'P']
            self.hp = sys.argv[3]
            self.ohp = sys.argv[4]
            self.hon = sys.argv[5]
            self.last = sys.argv[1][-1]
            print(self.move())

    def move(self):
        #check if I have low health or should rush the kill
        if (self.hp < 5 or self.ohp < 5) and self.hon > 0:
            return(random.choice(self.attack))
        # charge honour to get SOTG
        elif self.hon < 7:
            return 'B'
        #Alternate guarding and attacking
        else:
            if self.last == 'G':
                return(random.choice(self.attack))
            return 'G'
Sam = BlessedSamurai()

Để chạy:
Lưu dưới dạng BlishedSamurai.py

python BlessedSamurai.py <args>

4
Chương trình của bạn cần in di chuyển của nó.
mbomb007

3
Tôi đã không kiểm tra điều này, nhưng có vẻ như nó sẽ vượt ra khỏi giới hạn ở lượt đầu tiên, nơi chỉ có bốn đối số.
Geobits

Tôi đã sử dụng một định dạng tương tự như những gì anh ấy đã làm. @Stranjyr, hãy xem những gì tôi đã làm để có được các đối số.
mbomb007

Cảm ơn cả hai! Tôi không có quyền truy cập vào một trình thông dịch python ngay bây giờ, nhưng tôi nghĩ rằng tôi đã khắc phục vấn đề. Bằng cách nào đó tôi hoàn toàn bỏ lỡ rằng bộ hướng dẫn đầu tiên sẽ không có lịch sử.
Stranjyr

Xin chào, bạn đã có một lỗi nhỏ trong chương trình "tên toàn cầu 'cuối cùng" không được xác định ". Vì nó là một lỗi nhỏ, tôi đã thay đổi lastđể self.lastmà dường như để sửa chữa vấn đề.
absinthe

1

Hermurai (C ++)

Ngưỡng mộ đối thủ của mình, và có chút hoang tưởng. Muốn biết liệu anh ta có thể làm những gì các samurai khác có thể không, bởi vì anh ta vẫn không thể tin mình là một samurai. Giấc mơ không bao giờ phai mờ của anh trở thành hiện thực trước khi anh biết điều đó. Mà có thể phải trả giá ...

#include <stdio.h>
#include <string>
#include <sstream>

using namespace std;

char getLastAttack(string enemy_history)
{
    size_t found = enemy_history.find_last_of("IPO");
    if(found == string::npos)
    {
        return 'I';
    }

    return enemy_history[found];
}

int main(int argc, const char * argv[])
{
    if(argc != 7){
        printf("B");
        return 0;
    }

    string enemy_history(argv[2]);

    int ho;
    string honour(argv[5]);
    stringstream(honour) >> ho;

    if(ho > 20){
        char atk = getLastAttack(enemy_history);
        printf("%c", atk);
        return 0;
    }

    char lastMove = enemy_history[enemy_history.length()-1];
    if(lastMove == 'W' || lastMove == 'G')
        lastMove = 'B';
    printf("%c", lastMove);
    return 0;
}

Iniqy (C ++)

Tấn công hết sức có thể. Đi vào chế độ tấn công không thể ngăn cản khi anh ta gặp nguy hiểm.

#include <stdio.h>
#include <string>
#include <sstream>

using namespace std;

char getLastAttack(string enemy_history)
{
    size_t found = enemy_history.find_last_of("IPO");
    if(found == string::npos)
    {
        return 'I';
    }

    return enemy_history[found];
}

int main(int argc, const char * argv[])
{
    if(argc != 7){
        printf("B");
        return 0;
    }

    string history(argv[1]);
    string enemy_history(argv[2]);
    string health(argv[3]);
    string enemy_health(argv[4]);
    string honour(argv[5]);
    string enemy_honour(argv[6]);

    int he, enemy_he, ho, enemy_ho;
    stringstream(health) >> he;
    stringstream(enemy_health) >> enemy_he;
    stringstream(honour) >> ho;
    stringstream(enemy_honour) >> enemy_ho;

    if(ho > 6 || ((he < 6 || enemy_he < 6) && ho > 0))
    {
        char atk = getLastAttack(enemy_history);
        printf("%c", atk);
        return 0;
    }


    printf("B");
    return 0;
}

Cả hai đều được viết bằng C ++. Để biên dịch:

g++ iniqy.cpp -o iniqy

Để chạy trên Linux: ./iniqy

Để chạy trên Windows: iniqy.exe


1

Kẻ hủy diệt (hồng ngọc)

Kẻ hủy diệt không chú ý đến sức khỏe của chính mình. Kẻ hủy diệt không có khái niệm về danh dự. Kẻ hủy diệt được gửi đến từ tương lai và chỉ đơn giản là quyết tâm chấm dứt đối thủ của mình. Nó làm như vậy bằng cách xem đối thủ của nó di chuyển, và không có gì khác. Nó lấy mẫu các bước di chuyển và tính toán phản ứng phù hợp theo cách phức tạp đến mức không công nghệ nào ngày nay có thể dự đoán hành động của Kẻ hủy diệt. Trên thực tế, với bất kỳ ai sống vào năm 2015, Kẻ hủy diệt có vẻ hơi ngẫu nhiên ...

responses = {
  ?W => %w(B I),
  ?B => %w(I O),
  ?G => %w(B B),
  ?I => %w(G P),
  ?P => %w(B O),
  ?O => %w(G I)
}

if ARGV.size > 4
  pool = ARGV[1].chars.map{ |c| responses[c] }.flatten
  puts pool.sample
else
  puts %w(O I P B).sample
end

1

Đặc vụ 38 [1] (C)

Là một sản phẩm của thao tác di truyền sâu rộng, Agent 38 có vóc dáng và sắc sảo về tinh thần của một siêu [2] -samurai, và chắc chắn là vượt trội so với tất cả bất đắc dĩ của nó [cần dẫn nguồn] thiếu sót [cần dẫn nguồn] đối thủ cạnh tranh.


//Agent 38
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#ifdef _WIN32
#include <Windows.h>
unsigned int tick_count(){
    return GetTickCount();
}
#else
#include <sys/time.h>
unsigned int tick_count(){
    struct timeval t;
    gettimeofday(&t, NULL);
    return 1000 * t.tv_sec + t.tv_usec / 1000;
}
#endif

float program[5][4][4][4][4]={
    {{{{-1.192779,0.693321,-1.472931,-0.054087},{0.958562,0.557915,0.883166,-0.631304},{-0.333221,1.410731,0.496346,0.087134},{0.459846,0.629780,-0.479042,-0.025909}},{{0.547976,1.059051,-0.748062,-0.675350},{-0.607591,-0.152156,-0.400350,-0.685337},{1.686450,0.628706,0.312865,0.324119},{1.652558,0.403733,-0.456481,-0.081492}},{{0.371629,-0.036948,-0.982682,0.065115},{1.360809,0.681294,0.505074,0.782737},{-0.545192,0.954937,-0.727853,0.273542},{-0.575777,1.615253,-0.064885,-0.516893}},{{0.577015,-0.112664,0.456595,-0.007560},{-0.660930,-0.738453,0.668093,1.716388},{1.972322,0.108558,0.535114,-0.337916},{0.640208,-0.019680,-0.769389,0.873087}}},{{{-0.021140,-0.095956,-0.098309,-0.280295},{-0.926284,1.724028,0.278855,0.678060},{0.153006,-1.860947,-0.577699,-1.931683},{-0.187152,0.529719,-1.164157,0.125499}},{{0.582208,-0.835029,-0.329857,0.088176},{-0.030797,0.389396,0.584636,-0.025866},{-0.736538,1.624658,0.690493,0.387515},{0.973253,-0.530825,1.934379,-0.872921}},{{0.812884,0.138399,-1.452478,-1.504340},{-0.119595,0.986078,-0.993806,1.102894},{0.848321,-0.268764,0.876110,0.782469},{0.948619,-0.557342,0.749764,-0.712915}},{{-1.195538,0.783784,-1.973428,-0.873207},{0.085426,-0.241360,-0.534561,-0.372105},{0.029696,-0.906821,0.932227,-0.834607},{0.764903,-0.276117,-1.346102,-0.093012}}},{{{0.168113,0.855724,1.817381,-0.547482},{0.468312,0.923739,-0.723461,0.798782},{-0.875978,-0.942505,-0.684104,-0.046389},{0.893797,-0.071382,0.283264,0.811233}},{{0.391760,0.309392,-0.045396,-0.977564},{0.085694,0.257926,-0.775461,0.060361},{0.486737,-0.175236,0.806258,-0.196521},{0.691731,-0.070052,0.636548,0.464838}},{{0.532747,-1.436236,-0.900262,-0.697533},{0.566295,0.650852,0.871414,-0.566183},{-0.075736,-0.886402,0.245348,-0.438080},{-0.811976,0.022233,-0.685647,0.323351}},{{-1.864578,1.141054,1.636157,-0.455965},{0.592333,0.890900,-0.259255,0.702826},{0.404528,0.905776,0.917764,0.051214},{0.761990,0.766907,-0.595618,-0.558207}}},{{{0.209262,-1.126957,-0.517694,-0.875215},{0.264791,0.338225,0.551586,0.505277},{0.183185,0.782227,0.888956,0.687343},{0.271838,0.125254,1.071891,-0.849511}},{{0.261293,-0.445399,0.170976,-0.401571},{0.801811,0.045041,-0.990778,-0.013705},{-0.343000,-0.913162,0.840992,0.551525},{-0.526818,-0.231089,0.085968,0.861459}},{{0.540677,-0.844281,-0.888770,0.438555},{0.802355,-0.825937,0.472974,-0.719263},{-0.648519,1.281454,0.470129,-0.538160},{-0.851015,0.985721,-0.993719,0.558735}},{{1.164560,-0.302101,0.953803,0.277318},{0.886169,0.623929,1.274299,-0.559466},{-0.948670,0.807814,-1.586962,-0.502652},{-0.069760,1.387864,-0.423140,0.285045}}}},
    {{{{0.747424,-0.044005,0.402212,-0.027484},{0.785297,0.169685,0.734339,-0.984272},{-0.656865,-1.397558,0.935961,-0.490159},{-0.099856,-0.293917,0.129296,-0.920536}},{{0.546529,-0.488280,-0.516120,-1.112775},{0.155881,-0.103160,0.187689,0.485805},{0.918357,0.829929,0.619437,0.877277},{0.389621,0.360045,0.434281,0.456462}},{{-0.803458,-0.525248,-0.467349,0.714159},{-0.648302,-0.005998,-0.812863,0.205664},{0.591453,0.653762,-0.227193,-0.946375},{0.080461,0.311794,0.802115,-1.115836}},{{-0.495051,-0.869153,-0.179932,0.925227},{-1.950445,1.908723,-0.378323,-0.472620},{-0.688403,-1.470251,1.991375,-1.698926},{-0.955808,-0.260230,0.319449,-1.368107}}},{{{-0.029073,-0.622921,-1.095426,-0.764465},{-0.362713,-0.123863,0.234856,-0.772613},{0.697097,0.103340,0.831709,0.529785},{0.103735,-0.526333,-0.084778,0.696831}},{{-0.670775,0.289993,-0.082204,-1.489529},{0.336070,0.322759,0.613241,0.743160},{0.298744,-1.193191,0.848769,-0.736213},{0.472611,-0.830342,0.437290,-0.467557}},{{-0.529196,-0.245683,0.809606,-0.956047},{-1.725613,0.187572,0.528054,-0.996271},{-0.330207,0.206237,0.218373,0.187079},{0.243388,0.625787,-0.388859,0.439888}},{{-0.802928,-0.811282,0.788538,0.948829},{0.966371,1.316717,0.004928,0.832735},{-0.226313,0.364653,0.724902,-0.579910},{-0.544782,-0.143865,0.069256,-0.020610}}},{{{-0.393249,0.671239,-0.481891,0.861149},{-0.662027,-0.693554,-0.564079,-0.477654},{0.070920,-0.052125,-0.059709,0.473953},{-0.280146,-0.418355,0.703337,0.981932}},{{-0.676855,0.102765,-0.832902,-0.590961},{1.717802,0.516057,-0.625379,-0.743204},{-0.170791,-0.813844,-0.269250,0.707447},{0.057623,0.472053,-0.211435,0.147894}},{{-0.298217,0.577550,1.845773,0.876933},{0.617987,0.502801,0.951405,0.122180},{0.924724,-0.166798,0.632685,-0.466165},{-0.834315,-0.864180,-0.274019,0.568493}},{{0.669850,-0.961671,0.790462,0.738113},{-0.534215,-0.556158,0.653896,0.031419},{0.065819,0.220394,0.153365,-0.373006},{0.886610,-0.742343,1.282099,0.198137}}},{{{0.092579,-0.026559,-1.121547,0.143613},{-0.289030,0.265226,-0.350741,-0.897469},{-0.918046,0.038521,-1.515900,0.488701},{-0.759326,-1.782885,-1.787784,0.249131}},{{-0.849816,-0.857074,-0.843467,-0.153686},{0.998653,0.356216,0.926775,0.300663},{-0.749890,-0.003425,-0.607109,0.317334},{-0.561644,0.446478,-0.898901,0.711265}},{{0.232020,-0.445016,0.618918,0.162098},{0.381030,-0.036170,0.084177,0.766972},{0.493139,0.189652,-0.511946,-0.273525},{0.863772,-0.586968,0.829531,-0.075552}},{{0.191787,-0.627198,0.975013,-0.448483},{-0.197885,0.151927,-0.558646,-1.308541},{-0.582967,1.207841,0.746132,0.245631},{0.314827,-0.702463,-0.301494,0.787569}}}},
    {{{{0.670028,-1.825749,-0.739187,0.482428},{0.175521,-0.020120,-0.154805,0.187004},{0.971728,-0.160181,-0.164031,-0.868147},{-0.954732,-0.175713,0.791116,0.294173}},{{-0.958337,-0.843157,-0.472882,0.273517},{-0.999058,0.824762,-0.223130,-0.150628},{0.393747,-0.301297,0.095572,-0.798950},{-0.119787,0.746673,0.955094,0.259353}},{{0.951590,0.225539,0.503282,0.668746},{-0.384898,-0.979592,-0.005485,-0.191883},{-0.692369,-0.642401,-0.825598,0.171933},{-0.321919,-0.498635,0.449704,0.780842}},{{-0.387902,0.522435,0.565608,0.166193},{-0.799671,-0.295871,-0.702573,-0.151006},{0.040550,-0.468503,0.651076,0.636352},{-0.839299,-0.090651,0.428761,0.187043}}},{{{-0.369823,0.377011,0.422936,0.284752},{-0.181514,-0.701449,0.748768,0.540533},{0.734381,0.149410,-0.867043,-0.397142},{-0.770904,-0.581897,-1.578306,-0.402638}},{{0.859015,-0.540358,0.202715,-0.975354},{-0.773629,-0.382342,-0.022498,-0.129286},{-0.901210,-0.641866,1.219216,0.731525},{0.740457,0.858546,-0.408661,-0.364897}},{{-0.830865,-1.370657,-1.226303,-0.392147},{-0.810554,-0.975232,-0.717845,-0.825379},{-0.150096,-0.664533,0.347084,0.243443},{-0.447383,0.842164,1.491342,0.380295}},{{-0.383958,0.811219,0.160459,0.841601},{1.631515,0.371637,0.110000,0.467783},{-0.689356,-0.004289,-0.081057,-0.317243},{0.092451,-0.181268,-0.575747,-0.580061}}},{{{0.908549,-0.013975,-0.880165,-0.938937},{-0.225713,0.449478,0.372569,-0.229889},{0.255711,-0.264752,0.307982,0.260505},{0.314966,-0.540905,0.743032,-0.078475}},{{-0.307472,-1.268296,0.020383,1.798401},{-0.150954,0.909716,-0.407903,0.379046},{0.621853,-0.003629,-0.582697,0.614618},{-0.122843,-0.627133,-0.217968,0.608322}},{{0.071923,0.807315,0.538905,-0.630660},{0.495641,0.240202,-0.920822,-0.258533},{-1.760363,-0.448525,-0.351553,-0.551666},{0.152720,0.900531,0.061966,-0.544377}},{{0.648923,0.450945,-1.530020,1.570190},{0.536210,0.078454,0.577168,0.464872},{-0.888258,-0.950748,0.781474,0.958593},{0.463631,0.319614,-0.248374,-0.413144}}},{{{0.293463,0.236284,1.721511,0.107408},{-0.790508,-0.072027,-0.559467,-0.955839},{-0.777662,-0.169876,0.896220,0.776105},{0.003944,-0.745496,-0.236446,-0.824604}},{{-1.770746,-0.051266,-0.174258,0.003074},{-0.339553,-0.868807,-0.032754,-0.494847},{-0.896712,0.957339,-0.003444,-1.582125},{-0.699883,0.626691,0.799635,-0.542343}},{{-0.635123,-0.755960,0.576373,-0.899530},{-0.393745,0.718900,0.312400,0.511415},{-0.647565,0.368431,0.214726,0.892693},{-0.511960,-0.513262,0.885908,-0.536478}},{{-0.590074,0.623328,0.268674,-0.401391},{0.308868,-0.869862,0.233132,0.243337},{-0.242908,-0.557192,-0.728454,0.867029},{0.156435,-0.805308,-0.815392,-1.437798}}}},
    {{{{0.613484,1.454566,-0.363858,0.634053},{0.535096,-0.641079,-0.607553,0.852559},{0.959100,-0.398621,0.375819,0.385756},{-0.601982,0.494128,0.809699,0.608804}},{{-1.390871,-0.943062,1.556671,0.966501},{-0.013242,0.152716,-0.089592,0.230793},{0.933785,0.119358,0.057387,0.502033},{-0.332925,0.537509,-0.081436,-0.701995}},{{-0.435117,0.996885,0.646630,-0.092342},{0.004343,-0.737514,-0.716187,-0.946819},{0.814258,-0.766971,-0.488162,-0.531619},{-0.923069,0.683915,-0.023809,-1.242992}},{{-0.909155,-0.166488,-0.159273,-0.908121},{-0.783871,-0.522598,0.691845,-0.164065},{1.255966,0.051373,-0.566025,0.820081},{0.186583,0.266032,-0.793747,-0.510092}}},{{{0.890639,0.970042,-0.507885,-0.029557},{-0.771142,-0.875802,0.400070,-1.264247},{-0.881146,0.570950,-0.051624,0.347612},{0.312110,-0.374885,0.600112,0.388460}},{{-0.417107,-0.309284,-0.128477,0.689671},{-0.695866,1.254585,-0.381883,-0.313415},{0.433565,0.919626,0.159180,-0.657310},{-1.396139,0.346053,0.108768,0.061238}},{{-0.776695,0.084491,0.045357,0.312823},{-0.379268,1.217006,-0.014838,-1.032272},{-1.251344,-0.366283,-0.124786,0.729754},{0.979936,0.669519,-0.900018,-0.596954}},{{-0.998834,0.593942,0.375639,-0.627459},{0.297281,0.400240,0.839707,0.960262},{-0.872143,0.574040,-0.559580,-1.965570},{-0.559218,-0.778780,-0.955526,-0.253380}}},{{{-1.919625,-1.911049,0.025035,0.754917},{-0.110993,0.535933,-0.572788,-0.856476},{-0.810836,-0.496261,1.128368,1.758826},{-0.564368,-1.849772,-0.251560,0.635528}},{{0.768196,-0.934122,0.207228,0.884610},{-0.356145,0.265792,-0.835582,0.377675},{-0.410745,0.613212,0.245560,-0.873826},{1.725191,-0.263344,-0.077167,-0.976379}},{{-0.736299,-0.109476,0.044512,-0.004005},{0.692230,0.316670,0.267247,-1.076821},{-0.903184,0.189762,-0.674111,0.219113},{0.639162,1.347521,0.428823,-0.765664}},{{-0.509165,0.458806,-0.851011,0.455027},{-0.218564,-0.063492,0.889320,-0.762062},{0.145950,0.985037,-0.489372,-0.879851},{0.352346,-0.127275,0.896496,-0.596037}}},{{{0.402678,1.479855,0.089187,0.967153},{-0.431225,0.402980,0.883584,-0.900324},{0.262233,-0.647278,0.637005,0.142678},{-0.003253,-0.671924,0.969458,-0.316752}},{{0.345185,-0.477503,-0.326822,-0.106251},{0.239521,1.617125,0.632651,0.969976},{-1.015183,-0.676629,0.955842,0.134925},{-0.319063,-0.493157,-0.488088,0.713008}},{{-0.468621,1.301292,-1.826501,1.138666},{0.170247,-0.661171,0.895204,-0.400700},{-0.077645,-0.978179,-0.245724,0.245282},{-0.258300,0.287261,-0.006274,0.549716}},{{-0.932247,-0.274950,0.920451,0.016237},{0.888865,-0.845248,1.661716,-0.108960},{0.712357,0.586609,-0.867356,0.355058},{-0.540912,0.892622,0.302627,0.247194}}}},
    {{{{0.817578,0.719047,0.438903,0.637398},{0.750466,-0.911799,-0.609606,0.358541},{-1.782979,-0.851717,-0.802122,0.735913},{0.490604,-0.417822,-0.332074,0.836756}},{{-0.650232,-0.442026,0.874916,0.705671},{0.217602,-0.755841,0.573944,0.279365},{-0.713729,0.358880,-0.308992,0.778297},{0.832099,-0.916695,-0.887834,1.041483}},{{1.019467,1.099488,-0.130674,-0.241995},{0.792572,0.756977,0.518186,0.070411},{-0.815779,-0.790757,-1.027439,-0.163698},{0.721461,-0.403364,0.656609,-0.367364}},{{-0.279333,-0.742041,0.515832,-0.408114},{0.834577,0.736056,0.900594,0.276357},{0.726000,0.464991,-0.569281,0.098139},{-0.582324,0.875666,-0.681556,-0.903009}}},{{{1.300969,-0.798351,0.107230,1.611284},{0.239211,0.418231,-0.795764,-0.398818},{-0.939666,1.768175,-0.297023,-0.064087},{-0.239119,-0.365132,0.864138,0.595560}},{{1.898313,-0.343816,1.066256,0.876655},{-0.053636,0.544756,-0.937927,0.189233},{0.445371,-0.656790,-0.675091,0.753163},{-0.293330,-0.002717,0.341173,0.095493}},{{0.951658,0.513912,-0.678347,-0.981140},{-0.020791,0.571138,-0.890648,0.881789},{-1.783345,0.909598,-0.393155,0.240630},{-0.057908,-0.237435,-0.124993,-0.754091}},{{-0.014153,0.127172,0.097134,0.538952},{0.167943,0.786395,0.946153,-0.762513},{-0.562758,0.675657,-0.226395,0.979761},{0.850214,0.818309,0.397074,-0.372059}}},{{{0.803316,-0.659538,-1.987864,-0.186366},{-0.259213,0.315848,-0.427898,0.326521},{-0.168181,-0.620898,0.562309,0.722064},{-1.949690,0.307720,-0.147760,0.603492}},{{0.898339,0.986228,0.724530,0.105193},{0.066046,0.037689,-0.553543,0.597864},{0.296553,0.165199,0.500125,-0.395978},{0.790120,-1.873361,0.354841,-0.187812}},{{-0.559746,0.357012,0.373903,-0.113564},{-0.671918,-0.919720,0.258328,-0.283453},{0.008365,0.597272,0.355827,0.391287},{0.355297,-0.631888,0.221383,1.448221}},{{0.259199,-0.491776,0.721151,0.391427},{0.494000,0.652814,-0.153306,-0.615687},{0.142167,-0.601161,0.281702,0.563390},{0.904019,1.284241,0.901663,0.244620}}},{{{-0.664638,-0.564596,0.839897,0.153358},{-0.506883,0.822337,-0.974957,-0.098112},{-0.962870,-0.274566,0.418039,-0.020525},{-0.965969,0.954587,-0.250493,-0.031592}},{{-0.966475,0.455338,0.868491,0.723032},{-0.002141,0.021922,-0.131429,-0.601106},{-1.240003,1.483318,1.612920,-0.653210},{-0.505979,0.005588,-0.087506,-0.705789}},{{-0.203137,0.765652,-0.132974,-0.900534},{0.731132,0.133467,-1.086363,0.600763},{1.795911,-0.411613,-1.990494,0.405937},{0.729332,-0.119175,-0.979213,0.362346}},{{-0.049014,0.228577,-1.728796,-0.898348},{-0.540969,1.245881,-0.820859,0.285859},{0.430751,-0.373652,0.034535,0.434466},{0.365354,0.243261,0.910114,1.497873}}}}
};
float eval_polynomial(float variables[4],int program_index,int variable_index,int indices[4]){
    if(variable_index==4)return program[program_index][indices[0]][indices[1]][indices[2]][indices[3]];
    float result=0,base=1;
    for(int power=0;power<4;++power){
        indices[variable_index]=power;
        result+=base*eval_polynomial(variables,program_index,variable_index+1,indices);
        base*=variables[variable_index];
    }
    return result;
}
int main(int argc,char *argv[]){
    srand(tick_count());
    rand();
    float variables[4],probability[5],total=0;
    int i,indices[4],temp;
    for(i=0;i<4;++i){
        sscanf(argv[i-4+argc],"%d",&temp);
        variables[i]=temp;
    }
    temp=variables[1];
    variables[1]=variables[2];
    variables[2]=temp;
    if(variables[1]==0){ //bow if our honour is 0
        putchar('B');
        return 0;
    }

    variables[0]/=20;variables[2]/=20;
    variables[1]=1/(variables[1]+1);variables[3]=1/(variables[3]+1);
    for(i=0;i<5;++i){
        probability[i]=eval_polynomial(variables,i,0,indices);
        if(probability[i]<0)probability[i]=0;
        total+=probability[i];
        probability[i]=total;
    }
    total*=(float)rand()/RAND_MAX;
    for(i=0;i<5;++i)if(total<probability[i]){
        putchar("BGIPO"[i]);
        return 0;
    }
    putchar('B');
    return 0;
}

[1] Số hoàn toàn không liên quan [2] Được đảm bảo là đúng 1% thời gian


YAGMCSE

Các phương pháp của Monte Carlo dường như thể hiện lối chơi tử tế, vì vậy đây là Một mục mô phỏng Monte Carlo chung khác!

Không giống như hầu hết các mục khác trong cuộc thi này, mục này sử dụng một số lượng lớn mô phỏng các trò chơi ngẫu nhiên và do đó yêu cầu sử dụng cờ -O3 để có hiệu suất tối ưu.

Biên dịch chương trình bằng lệnh: gcc monte.c -o monte -O3 -std = c99

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#ifdef _WIN32
#include <Windows.h>
unsigned int tick_count(){
    return GetTickCount();
}
#else
#include <sys/time.h>
unsigned int tick_count(){
    struct timeval t;
    gettimeofday(&t, NULL);
    return 1000 * t.tv_sec + t.tv_usec / 1000;
}
#endif

const int turn_limit=500;
enum Move{
    WAIT,BOW,GUARD,QUICK,PARRY,OVERHEAD
};
struct Player{
    int health,honour;
    enum Move lastMove;
};
typedef struct Player Player;
//<command> <history> <enemy_history> <your_health> <enemy_health> <your_honour> <enemy_honour>
//<command> <your_health> <enemy_health> <your_honour> <enemy_honour>
int damage_table[6][6][2]={
    {{0,0},{0,0},{0,0},{1,0},{1,0},{1,0}}, //P1 is waiting
    {{0,0},{0,0},{0,0},{1,0},{1,0},{1,0}}, //P1 is bowing
    {{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}}, //P1 is guarding
    {{0,1},{0,1},{0,0},{0,0},{1,0},{0,1}}, //P1 is using quick draw
    {{0,1},{0,1},{0,0},{0,1},{0,0},{1,0}}, //P1 is parrying
    {{0,1},{0,1},{0,0},{1,0},{0,1},{0,0}} //P1 is using overhead attack
};
enum Move decode_move(char x){
    switch(x){
        case 'W': return WAIT; break;
        case 'B': return BOW; break;
        case 'G': return GUARD; break;
        case 'I': return QUICK; break;
        case 'P': return PARRY; break;
        case 'O': return OVERHEAD; break;
    }
    return WAIT;
}
struct SimulationStat{
    enum Move first_me_move;
    int win,draw,lose,compound;
};
int stat_compare(const void*a,const void*b){
    return ((struct SimulationStat*)b)->compound-((struct SimulationStat*)a)->compound;
}
struct SimulationStat monte_carlo(int num_iters,enum Move first_me_move,Player original_me,Player original_opponent){
    struct SimulationStat simulation_result={first_me_move,0,0,0};

    for(int iter=0;iter<num_iters;++iter){
    Player me=original_me,opponent=original_opponent;
        int turn,game_result;
        for(turn=0;turn<turn_limit;++turn){
            enum Move me_move,opponent_move=rand()%(OVERHEAD-BOW+1)+BOW;
            if(turn==0)me_move=first_me_move;
            else me_move=rand()%(OVERHEAD-BOW+1)+BOW;

            //update honour for guarding
            if(me.lastMove==GUARD&&me_move==GUARD)--me.honour;
            if(opponent.lastMove==GUARD&&opponent_move==GUARD)--opponent.honour;

            int me_attacking=me_move==QUICK||me_move==PARRY||me_move==OVERHEAD,opponent_attacking=opponent_move==QUICK||opponent_move==PARRY||opponent_move==OVERHEAD;

            //update health of players
            me.health-=damage_table[me_move][opponent_move][0]*(1+(opponent.honour>=7));
            opponent.health-=damage_table[me_move][opponent_move][1]*(1+(me.honour>=7));

            //update honour for attacking (Sword of the Gods is revoked after the player attacks with an original honour value of 7)
            if(me_attacking)--me.honour;
            if(opponent_attacking)--opponent.honour;

            //printf("%d %d\n",me.health,me.honour);
            //printf("%d %d\n",opponent.health,opponent.honour);

            //check if any of the terminating conditions are met
            //c. both players fall off the graces of the gods (me.honour<0&&opponent.honour<0)
            if(me.honour<0&&opponent.honour<0){
                game_result=0; //draw
                break;
            }
            //a. player 1 falls off the graces of the gods (me.honour<0)
            else if(me.honour<0){
                game_result=-1; //loss
                break;
            }
            //b. player 2 falls off the graces of the gods (opponent.honour<0)
            else if(opponent.honour<0){
                game_result=1; //win
                break;
            }
            //d. both players are dead (me.health<0&&opponent.health<0)
            else if(me.health<0&&opponent.health<0){
                game_result=0; //draw
                break;
            }
            //e. player 1 is dead (me.health<0)
            else if(me.health<0){
                game_result=-1; //loss
                break;
            }
            //f. player 2 is dead (opponent.health<0)
            else if(opponent.health<0){
                game_result=1; //win
                break;
            }
        }
        //both players get struck down by the guards for being boring
        if(turn==turn_limit)game_result=0; //draw

        if(game_result==1)++simulation_result.win;
        else if(game_result==0)++simulation_result.draw;
        else ++simulation_result.lose;
    }
    return simulation_result;
}
int main(int argc,char*argv[]){
    //const int num_iters=200000,num_shortlist_iters=1000000;
    const int num_iters=20000,num_shortlist_iters=55000;

    srand(tick_count());
    Player me,opponent;
    if(argc==5){
        sscanf(argv[1],"%d",&me.health);
        sscanf(argv[2],"%d",&opponent.health);
        sscanf(argv[3],"%d",&me.honour);
        sscanf(argv[4],"%d",&opponent.honour);
        me.lastMove=WAIT;
        opponent.lastMove=WAIT;
    }else{
        sscanf(argv[3],"%d",&me.health);
        sscanf(argv[4],"%d",&opponent.health);
        sscanf(argv[5],"%d",&me.honour);
        sscanf(argv[6],"%d",&opponent.honour);
        me.lastMove=decode_move(argv[1][strlen(argv[1])-1]);
        opponent.lastMove=decode_move(argv[2][strlen(argv[2])-1]);
    }

    struct SimulationStat results[6];
    results[0].first_me_move=WAIT;
    results[0].win=0;
    results[0].draw=0;
    results[0].lose=num_iters;
    results[0].compound=-num_iters*2-1000; //waiting is worse than any other action

    for(enum Move first_me_move=BOW;first_me_move<=OVERHEAD;++first_me_move){
        results[first_me_move]=monte_carlo(num_iters,first_me_move,me,opponent);
        struct SimulationStat *cur=&results[first_me_move];
        cur->compound=cur->win*4+cur->draw*1-cur->lose*2;
    }
    qsort(results,OVERHEAD-WAIT+1,sizeof(*results),stat_compare);

    for(int i=0;i<OVERHEAD-BOW+1;++i){
        struct SimulationStat *cur=&results[i];
//        fprintf(stderr,"%c: %f%% win, %f%% draw, %f%% lose => %d\n","WBGIPO"[cur->first_me_move],(double)cur->win/num_iters*100.,(double)cur->draw/num_iters*100.,(double)cur->lose/num_iters*100.,cur->compound);
    }

    for(int i=0;i<2;++i){
        results[i]=monte_carlo(num_shortlist_iters,results[i].first_me_move,me,opponent);
        struct SimulationStat *cur=&results[i];
        cur->compound=cur->win*2+cur->draw*1;
    }
    qsort(results,2,sizeof(*results),stat_compare); 

    for(int i=0;i<2;++i){
        struct SimulationStat *cur=&results[i];
//        fprintf(stderr,"%c: %f%% win, %f%% draw, %f%% lose => %d\n","WBGIPO"[cur->first_me_move],(double)cur->win/num_shortlist_iters*100.,(double)cur->draw/num_shortlist_iters*100.,(double)cur->lose/num_shortlist_iters*100.,cur->compound);
    }
    putchar("WBGIPO"[results[0].first_me_move]);
    return 0;
}

1
Anh ta dường như chỉ cúi đầu vì bất cứ lý do gì. Bạn có thể muốn cho nó một cái nhìn
C5H8NNaO4

@ C5H8NNaO4 Cảm ơn bạn đã thông báo cho tôi về lỗi nghiêm trọng này. Chỉnh sửa của tôi nên sửa lỗi.
Potatomato

YAGMCSE dường như chỉ làm một trong hai GBWWWWW...hoặcBWWWW
C5H8NNaO4

@ C5H8NNaO4 Thật lạ. Tôi không thể sao chép các kết quả mà bạn đã đề cập. Là đối thủ của YAGMCSE liên tục cúi đầu / bảo vệ / chờ đợi?
Potatomato

Vâng, anh ấy đã cúi đầu 7 vòng đầu tiên. Đây là một pastebin
C5H8NNaO4

1

Sau khi thất bại trong việc nhập Target Dummy, tôi giới thiệu với bạn bot tiếp theo của tôi ...

ScroogeBot - Python 2

Bot này sẽ cúi đầu nếu anh ta có một vinh dự. Nếu không anh ta sẽ lật một đồng xu.

Nếu nó rơi trúng đầu, anh ta sẽ thực hiện một cuộc tấn công ngẫu nhiên. Nếu nó đậu trên đuôi, anh ta sẽ cúi đầu hoặc bảo vệ.

Chỉ huy: python scroogebot.py

import random, sys
# If he has more than one honor...
if int(sys.argv[5]) > 1:
    #Flip a coin.
    coin = random.choice(['heads','tails'])
    #If the coin lands on heads...
    if coin == 'heads':
        #Attack!
        print random.choice(['I','O','P'])
    #If the coin lands on tails...
    else:
        #Don't attack!
        print random.choice(['G','B'])
#If he has 1 honor...
else:
    #Bow!
    print "B"

Yay, một mục mới! Chỉ cần nhanh chóng lên - có thể là một lúc trước khi tôi có thể thiết lập một giải đấu mới, vì tôi đã tái cấu trúc hệ điều hành của mình ngày hôm qua. Tôi nên có một giải đấu mới được thực hiện với kết quả của bạn vào cuối tuần.
absinthe

0

Yoshimitsu (JS)

Cố gắng để không được bảo vệ bằng cách kiểm tra hai di chuyển cuối cùng, sẽ có được sự dũng cảm với danh dự cao hơn. dựa trên các apsillers mẫu được thực hiện

var attacks = ['I','P','O'];
var pasive = ['B','W'];
var argv = process.argv;
var playerHistory = argv.length>6?argv[2].split(''):[];
var enemyHistory = argv.length>6?argv[3].split(''):[];
var offset = 8 - argv.length;
var my = { health:+argv[4-offset], honor:+argv[6-offset], history:playerHistory };
var enemy = { health:+argv[5-offset], honor:+argv[7-offset], history:enemyHistory };
my.godSword = my.honor >= 7;
enemy.godSword = enemy.honor >= 7;

enemy.lastMove = enemyHistory.pop();
enemy.secondToLast = enemyHistory.pop();

enemy.didAttack = !!attacks.indexOf(enemy.lastMove);

my.lastMove = playerHistory.pop();

function decide() {
    process.stdout.write(arguments[Math.floor(arguments.length*Math.random())]);
    process.exit();
}

chooseAnAttack = function(){ decide.apply(this,attacks); };

if( ( pasive.indexOf( enemy.lastMove ) && my.honor < 15 ) || (my.honor < 7 && enemy.health > 10) || my.honor === 1 ){
    if( Math.random * 15 < my.honor ){
        chooseAnAttack();
    } else {
        decide('B');
    }
} else if( enemy.honor < 2 ){
    chooseAnAttack();
} else if( enemy.didAttack ){

    if( attacks.indexOf( enemy.secondToLast ) ){
        decide('G');
    } else if( pasive.indexOf( enemy.secondToLast ) ){
        chooseAnAttack();
    } else if( enemy.secondToLast == 'G' ){
        decide('B');
    }

} else if( enemy.lastMove = 'G' ) {
    chooseAnAttack();
} else if( enemy.lastMove === 'W' ){
    if( attacks.indexOf( enemy.secondToLast ) ){
        decide('G');
    } else if( pasive.indexOf( enemy.secondToLast ) ){
        chooseAnAttack();
    } else if( enemy.secondToLast == 'G' ){
        decide('B');
    }
}

0

Lừa (C)

The Fool thực hiện một chiến lược khá thất thường, không bao giờ lặp lại cùng một động thái hai lần trừ khi bị buộc phải thiếu danh dự. Chuyển động của anh chủ yếu dựa trên sự ngẫu nhiên, khiến cho việc dự đoán hành động của anh trở nên khó khăn. Hạnh phúc của anh ấy là điều cuối cùng trong tâm trí anh ấy, vì suy nghĩ của anh ấy chỉ được đặt ra khi chiến thắng đổ máu và cuối cùng

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

const char commands[] =
{
    'W', 'B', 'G', 'I', 'P', 'O'
};

char select_candidate(const char c[])
{
    unsigned i = 0;
    int n_candidates = 0;
    char candidates[sizeof(commands)];

    for (; i < sizeof(commands); i++)
        if (c[i])
            candidates[n_candidates++] = c[i];

    /* There are no candidates for actions, so the fool blindly attacks his opponent, hoping for the best */
    return n_candidates == 0 ? 'I' : candidates[rand() % n_candidates];
}

int main(int argc, char *argv[])
{
    unsigned i = 0;
    int honour;
    char candidates[sizeof(commands)];
    char last_action;

    srand(time(NULL));

    memcpy(candidates, commands, sizeof(commands));

    /* It's the first round, the fool selects a random action except for waiting */
    if (argc != 7)
    {
        candidates[0] = 0;
        putchar(select_candidate(candidates));
        return 0;
    }

    last_action = argv[1][strlen(argv[1]) - 1];
    honour = atoi(argv[5]);

    if (honour == 0)
    {
        /* The fool realises he will meet his doom if he performs any of the following moves */
        /* and removes them from his list of possible actions */
        candidates[3] = 0;
        candidates[4] = 0;
        candidates[5] = 0;

        /* Only omit the blocking action if the last action was blocking */
        if (last_action == 'G')
            candidates[2] = 0;
    } else if (honour >= 7) {

        /* If the fool has the opportunity to abuse power, he will */
        candidates[0] = 0;
        candidates[1] = 0;
    }

    /* However unintellegent, the fool decides never to repeat the same move twice */
    for (; i < sizeof(commands); i++)
    {
        if (candidates[i] == last_action)
        candidates[i] = 0;
    }

    /* The fool randomly selects a possible action and hopes for the best */
    putchar(select_candidate(candidates));

    return 0;
}


Nhà tiên tri (C)

Nhà tiên tri sử dụng kiến ​​thức về 2 nước đi trước của đối thủ để dự đoán hành động tiếp theo của anh ta và cung cấp một cuộc phản công nhanh và nguy hiểm. Ngoài ra, anh ấy làm chiêm tinh và các công cụ.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

int main(int argc, char* argv[])
{
    char* hist;
    char* enemy_hist;
    int hist_len;
    int enemy_hist_len;
    int health;
    int enemy_health;
    int honour;
    int enemy_honour;

    if (argc != 7)
    {
        /* Always start with guarding */
        putchar('G');
        return 0;
    }

    srand(time(NULL));

    /* Grab the command-line values */
    hist         = argv[1];
    enemy_hist   = argv[2];
    health       = atoi(argv[3]);
    enemy_health = atoi(argv[4]);
    honour       = atoi(argv[5]);
    enemy_honour = atoi(argv[6]);

    hist_len = strlen(hist);
    enemy_hist_len = strlen(enemy_hist);

    /* Looks like the enemy is starving for honour. */
    /* This means that they have to bow, so attack them,  */
    /* But only if we have the honour to do so. */
    if (enemy_honour == 0 && honour > 0)
    {
        putchar('O');
        return 0;
    } else if (honour == 0) {
        /* We have to bow */
        putchar('B');
        return 0;
    } else if (honour <= 3) {
        /* We have low honour, attack if the enemy has no honour, otherwise bow to restore some of our honour */
        putchar(enemy_honour == 0 ? ((rand() % 2) ? 'I' : 'O') : 'B');
        return 0;
    }

    switch (enemy_hist[enemy_hist_len - 1])
    {
        /* The enemy has previously performed a passive action, so they will likely attack this round */
        case 'W':
        case 'B':
        case 'G':
            putchar(hist[hist_len - 1] == 'G' ? 'P' : 'G'); /* Protect ourselves, using `guard` if we did not use it last turn */
            return 0;

        default:
            if (enemy_hist_len >= 2)
            {
                switch (enemy_hist[enemy_hist_len - 2])
                {
                    case 'I':
                    case 'P':
                    case 'O':
                        /* The enemy has attacked for the last 2 turns, they will likely rest now */
                        putchar((rand() % 2) ? 'I' : 'O');
                        return 0;

                    default:
                        /* Low health, block an incoming attack */
                        if (health <= 5)
                        {
                            putchar(hist[hist_len - 1] == 'G' ? 'P' : 'G');
                            return 0;
                        } else {
                            /* Choose randomly to bow or attack */
                            int decision = rand() % 3;
                            putchar(decision == 2 ? 'B' : decision == 1 ? 'I' : 'O');
                            return 0;
                        }
                }
            } else {
                /* Attack! */
                putchar((rand() % 2) ? 'I' : 'O');
                return 0;
            }
    }

    /* If somehow we get to this point, parry */
    putchar('P');
    return 0;
}


Biên soạn

Cả hai chương trình đều được viết bằng C và có thể được biên dịch bằng gcc:

gcc fool.c -o fool
gcc prophet.c -o prophet


Đang chạy

* nix

./fool <args>
./prophet <args>

các cửa sổ

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