Đánh giá một trận chiến lược


11

Trong trò chơi Stratego, cơ chế trò chơi chính là khi bạn tấn công quân cờ của đối thủ. Trong thử thách này, công việc của bạn là mô phỏng một trong những trận chiến này và nói ai sống sót.

Thông số kỹ thuật

Bạn sẽ nhận được như là một cặp chuỗi đại diện cho các mảnh Stratego. Các mảnh là một trong "S 1 2 3 4 5 6 7 8 9 10 B"( Slà Spy, và Blà bom). Người đầu tiên của cặp sẽ là kẻ tấn công, và người thứ hai là kẻ tấn công.

Dưới đây là các quy tắc để xác định kết quả của một trận chiến:

  • Số càng cao thì số càng thấp : ["4", "6"] -> ["6"].
  • Nếu cả hai đều giống nhau, thì cả hai đều chết : ["7", "7"] -> [].
  • Các gián điệp ở phía dưới, bên dưới thậm chí 1: ["S", "2"] -> ["2"].
  • Tuy nhiên, nếu một điệp viên tấn công 10, thì điệp viên đó sẽ thắng : ["S", "10"] -> ["S"].
  • Nhưng các quy tắc thông thường vẫn được áp dụng nếu đó 10là một cuộc tấn công : ["10", "S"] -> ["10"].
  • Nếu bất cứ thứ gì tấn công một quả bom, quả bom sẽ thắng : ["5", "B"] -> ["B"].
  • Tuy nhiên, một người thợ mỏ (một 3), có thể xoa dịu một quả bom: ["3", "B"] -> ["3"].
  • Một quả bom sẽ không bao giờ là kẻ tấn công.
  • Một spotter (a 1), có thể tấn công bằng cơ chế bình thường, nhưng họ cũng có thể cố gắng "đoán" thứ hạng của người chơi khác, có thể được biểu thị bằng bất kỳ ký hiệu lành mạnh nào.
  • Nếu họ đoán đúng, mảnh kia sẽ chết : ["1(5)", "5"] -> ["1"].
  • Nếu họ đoán sai, không có gì xảy ra : ["1(3)", "5"] -> ["1", "5"].
  • Spotters có thể phát hiện ra bom : ["1(B)", "B"] -> ["1"].

Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ thắng!

(Bạn có thể sử dụng các ví dụ trên đó làm trường hợp thử nghiệm, vì tôi quá lười để đặt tất cả chúng vào cùng một danh sách).


chúng ta có thể sử dụng 0 và 11 để đại diện cho S và B tương ứng không?
Rò rỉ Nun

@LeakyNun không, điều đó sẽ làm cho việc xếp hạng chúng quá dễ dàng.
Maltysen

1
Tôi biết về sự đảo ngược của các cấp bậc (1s từng là tốt nhất, chỉ bị đánh bại bởi các gián điệp tấn công, 8 là thợ mỏ và 9 là tồi tệ nhất), nhưng tôi chưa bao giờ nghe về thứ hạng spotter hoặc quy tắc đoán và thắng. Nhưng đó chỉ là tôi bập bẹ. Quan tâm thực tế ở đây: Còn cờ thì sao?
msh210

1
@ msh210 Tôi đang xem xét có đầu ra "Victory!"cho họ, nhưng không muốn làm phức tạp mọi thứ quá nhiều
Maltysen

Không phải một Spy chiến thắng bất kỳ trận chiến nào (nếu một kẻ tấn công), ngoại trừ Bom và mất tất cả các phòng thủ? Và bộ quy tắc Stratego này là từ đâu? Spotters (Scouts) sẽ là 2s, và không có 1s trong trò chơi Stratego của tôi ... (hoặc chúng chỉ được sửa đổi cho mục đích của thử thách?)
mbomb007

Câu trả lời:


3

Haskell, 131 byte

Giải pháp này ở dạng hàm infix #với loạiString -> String -> String

Đầu vào được chấp nhận thông qua hai đối số chuỗi. Định dạng cho đầu vào spotter là 1 xnơi xđoán. Đầu ra được đưa ra dưới dạng một chuỗi. Trong trường hợp cả hai đơn vị tồn tại, chuỗi trả về chứa cả hai cách nhau bởi một khoảng trắng.

Giải pháp ban đầu của tôi không may mắc lỗi và việc sửa chữa khiến tôi mất vài byte.

('1':' ':x)#y|x==y="1"|1>0="1 "++y
"S"#"10"="S"
"3"#"B"="3"
_#"B"="B"
x#y|x==y=[]
t@"10"#_=t
_#t@"10"=t
"S"#x=x
x#"S"=x
x#y=max x y

1

Python, 180 153 byte

def f(a,d,g=0):T=([[d]],[[a]]);return([[a]+[d]*(g!=d)]*(g!=0)+[[]]*(a==d)+T[d=="10"]*(a=="S")+T[1]*(d=="S")+T[a=="3"]*(d=="B")+T[int(a,36)>int(d,36)])[0]

Hàm này lấy kẻ tấn công, người phòng thủ và tùy ý đoán của người phát hiện (nếu kẻ tấn công là người phát hiện) làm đối số. Nó trả về một mảng chứa các mảnh còn sống.

Ung dung

def f(a,d,g=0):
 if g: return [a] if g==d else [a,d]
 if a==d: return []
 if a=="S": return [a] if d=="10" else [d]
 if d=="S": return[a]
 if d=="B": return [a] if a=="3" else [d]
 return [a] if int(a)>int(d) else [d]

Bản giới thiệu

https://repl.it/C6Oz/2


([a,d],[a])[g==d]->[a,d][:(g!=d)+1]
Nữ tu bị rò rỉ

@Leaky Nun - Cảm ơn, và [a] + [d] * (g == d) vẫn ngắn hơn.
Chuck Morris

1

Javascript ES6, 98 86 byte

(a,b,g)=>a==1?b==g?a:[a,b]:b=="B"?a==3?a:b:a=="S"?b==10?a:b:b=="S"?a:a==b?[]:+a>+b?a:b

Chấp nhận 3 đối số (kẻ tấn công, người bảo vệ, người đoán điểm).

Ví dụ chạy:

f("4","6")     -> "6"
f("7","7")     -> []
f("S","2")     -> "2"
f("S","10")    -> "S"
f("10","S")    -> "10"
f("5","B")     -> "B"
f("3","B")     -> "3"
f("1","5","5") -> "1"
f("1","5","3") -> ["1","5"]
f("1","B","B") -> "1"

1
Nếu bạn không cần trả về một mảng, bạn có thể lưu một số byte.
Không phải Charles

Mã của bạn không hoạt động chính xác đối với tôi khi người phát hiện không đoán được. f("1","10") -> ["1","10"]hơn "10".
ankh-morpork

0

Javascript, 179 166 160 byte

f=(a,c,b,n="")=>{if(c)if(c==b)return[a];else return[a,b];if(a==b)return[];a+b=="3B"&&(b=n);a=b=="B"?n:a;b=b=="S"?n:b;a+b=="S10"&&(a=n,b="S");return[+a>+b?a:b]}

Hàm này có 3 đối số - đầu tiên là kẻ tấn công, thứ hai được sử dụng cho người chạy nước rút (phỏng đoán của họ) và thứ ba là người bảo vệ.

Biểu tượng thanh kiếm đến từ cliparts.co


0

TSQL, 162 124 byte

Chơi gôn

DECLARE @1 varchar(2)='1',@ varchar(2)='3',@s varchar(2)='4'

PRINT IIF(@s>'',IIF(@=@s,@1,@1+','+@),IIF(@1=@,'',IIF(@1+@
IN('S10','3B')or'S'=@,@1,IIF(@='B'or'S'=@1,@,IIF(@1/1<@,@1,@)))))

Ung dung:

DECLARE 
  @1 varchar(2)='1', -- first piece
  @  varchar(2)='3',  -- second piece
  @s varchar(2)='4'  -- spotter(only fill this value for spotters)

PRINT
  IIF(@s>'',
    IIF(@=@s,@1,@1+','+@),
      IIF(@1=@,'',
        IIF(@1+@ IN('S10','3B')or'S'=@,@1,
          IIF(@='B'or'S'=@1,@,
            IIF(@1/1<@,@1,@)))))

Vĩ cầm

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.