Tìm kết quả của một trò chơi chiến tranh
Khi tôi còn học tiểu học, có một trò chơi "Rock-Paper-Kéo" mà chúng tôi đã chơi trong các hội đồng, khi chờ giáo viên của chúng tôi, vào giờ ra chơi, v.v. Chúng tôi gọi đó là "Chiến tranh". Sau khi tìm kiếm, tuy nhiên, hóa ra đây là một biến thể đơn giản hơn nhiều của "Trò chơi bắn súng" (theo WikiHow) . Tôi sẽ gọi nó là "Chiến tranh" vì các quy tắc hơi khác nhau:
2 người ngồi đối diện nhau. Mục tiêu của trò chơi là "giết" người chơi khác. Mỗi lượt, bạn có thể chơi một trong 3 động tác:
Tải lại : Bạn có một khẩu súng giữ một phát duy nhất. Nó phải được tải lại trước khi nó có thể bị bắn mỗi lần. Tải lại khi bạn đã có đạn là hợp pháp, nhưng không làm gì cả. Một tải lại được tượng trưng bằng cách chạm vào thái dương của bạn bằng cả hai tay. Mỗi người chơi bắt đầu với 0 đạn.
Bảo vệ : Di chuyển an toàn duy nhất. Nếu bạn bị bắn trong khi bảo vệ, bạn sẽ không chết. Bảo vệ được tượng trưng bằng cách khoanh tay trước ngực.
Ngọn lửa : Bắn súng của bạn. Để bắn thành công, bạn phải tải lại kể từ lần bắn cuối cùng. Nếu đối thủ của bạn đang tải lại, bạn thắng. Nếu họ cũng bắn, và cả hai bạn đều có đạn, đó là một trận hòa. Nếu họ bảo vệ, bạn đã lãng phí đạn. Mặc dù bắn mà không có đạn là một động thái hợp pháp, nó không làm gì và khiến bạn dễ bị tổn thương như tải lại. Bắn được tượng trưng bằng cách chỉ vào người chơi khác.
Nó được chơi tương tự như RPS, trong đó mỗi người chơi đồng thời ném xuống sự lựa chọn của họ (chúng tôi gõ hai chân vào giữa hai lượt để giữ nhịp với nhau, nhưng điều đó không quan trọng đối với thử thách).
Các thách thức:
Nhiệm vụ của bạn là tìm ra kết quả của một trò chơi Chiến tranh. Nó có thể là một chức năng hoặc chương trình đầy đủ.
Đầu vào
Tùy chọn mỗi người chơi chọn mỗi lượt sẽ được thể hiện bằng một ký tự / chuỗi:
r : tải lại
g : bảo vệ
f : lửa
Đầu vào sẽ là một danh sách các cặp, một chuỗi được phân tách / không giới hạn hoặc bất cứ thứ gì khác dọc theo các dòng này.
Một ví dụ đầu vào trong Python có thể là [("r", "g"), ("f", "r")]
, nghĩa là ở lượt đầu tiên, người chơi thứ nhất đã tải lại và người chơi thứ hai được bảo vệ. Ở lượt thứ hai, người chơi thứ nhất bắn, trong khi người chơi thứ hai tải lại. Người chơi thắng một trò chơi này. Các đầu vào tương tự tùy chọn có thể được biểu diễn như "r g f r"
, "rgfr"
, "rg fr"
"rg-fr"
...
Bạn có thể giả sử như sau:
Đầu vào sẽ khớp với định dạng bạn đã chọn và nó sẽ chỉ chứa các ký tự hợp lệ.
Ai đó sẽ chết trong vòng 100 lượt.
Tuy nhiên, bạn không thể cho rằng lượt chơi kết thúc khi ai đó chết.
Đầu ra
Một giá trị cho biết ai thắng (hoặc, ai thắng trước *
). Bạn có thể chọn đầu ra cho mỗi kịch bản, nhưng phải tính đến các trường hợp sau:
Người chơi 1 thắng
Người chơi thắng 2
Họ giết nhau (vẽ)
Mỗi kết quả phải có một giá trị quận và phải luôn giống nhau cho từng kịch bản.
Ví dụ: bạn có thể xuất 1
khi người chơi 1 thắng, 2
khi người chơi 2 thắng và 0
trong trường hợp bốc thăm. Sau đó, bạn phải luôn xuất 1
khi người chơi 1 thắng, 2
khi người chơi 2 thắng và 0
trong trường hợp bốc thăm.
Nó có thể được trả lại, hoặc in ra thiết bị xuất chuẩn. Trailing khoảng trắng là tốt.
Thật rõ ràng, kịch bản duy nhất dẫn đến một trận hòa là nếu cả hai người chơi đều nổ súng và cả hai đều có đạn.
*
Vì trong thử thách này, lượt chơi có thể tiếp tục sau khi ai đó chết, cuối cùng có thể nhiều hơn 1 người chơi có thể giành chiến thắng. Bạn cần tìm ai thắng trước theo đầu vào.
Các trường hợp thử nghiệm (giả sử 1
khi P1 thắng, 2
khi P2 thắng và 0
rút thăm):
"rg fr" => 1 (P1 shot P2 while they were reloading)
"rg ff" => 1 (They both shot, but only P1 had ammo)
"rr ff" => 0 (Both had ammo and shot each other)
"rr ff rr fg" => 0 (Both had ammo and shot each other. Everything after the first win is ignored)
"rr fg rf" => 2 (P2 shot P1 while they were reloading)
"rf gg rr fg rr fr" => 1
(P2 tried to shoot but didn't have any ammo, then they both guarded, then they both reloaded, then P2 blocked a shot, then they both reloaded again [but P2 still only has 1 ammo!], then P1 shoots P2 while they're reloading.
"rr gf fr rf gg rg ff" => 1
^ Player 1 wins here. The rest to the right has no effect on the output
Đây là mã golf, vì vậy số byte nhỏ nhất sẽ thắng!
Lưu ý, như các trường hợp thử nghiệm cho thấy, bạn phải xử lý các động thái "ngu ngốc". Nó hoàn toàn hợp lệ khi người chơi cố gắng bắn khi họ không có đạn hoặc tải lại 2 lượt liên tiếp (và chỉ tích lũy một đạn duy nhất).
{"rff","rgf"}
không?