ประเมินกลยุทธ์การต่อสู้


11

ในเกม Stratego ช่างหลักของเกมคือเมื่อคุณโจมตีฝ่ายตรงข้ามกับคุณ ในการท้าทายนี้งานของคุณคือจำลองสถานการณ์การต่อสู้หนึ่งอย่างและบอกว่าใครรอด

รายละเอียด

คุณจะได้รับเป็นอินพุตของสตริงที่เป็นตัวแทนของกลยุทธ์ Stratego ชิ้นส่วนเป็นหนึ่งในนั้น"S 1 2 3 4 5 6 7 8 9 10 B"( SคือสายลับและBเป็นระเบิด) คู่แรกจะเป็นผู้โจมตีและครั้งที่สองจะถูกโจมตี

นี่คือกฎในการตัดสินผลลัพธ์ของการต่อสู้:

  • ["4", "6"] -> ["6"]จำนวนที่สูงขึ้นเต้นจำนวนล่าง:
  • ถ้าทั้งคู่เหมือนกันก็จะตายทั้งสอง: ["7", "7"] -> [].
  • สายลับอยู่ด้านล่างใต้คู่1: ["S", "2"] -> ["2"].
  • อย่างไรก็ตามถ้าสายลับโจมตีสายลับ10ก็ชนะ: ["S", "10"] -> ["S"].
  • แต่กฎปกติยังคงใช้ถ้าเป็นหนึ่งโจมตี:10["10", "S"] -> ["10"]
  • ["5", "B"] -> ["B"]หากมีสิ่งใดโจมตีระเบิดชนะระเบิด:
  • อย่างไรก็ตามคนงานเหมือง (ก3) ["3", "B"] -> ["3"]สามารถกลบเกลื่อนระเบิด:
  • ระเบิดจะไม่เป็นผู้โจมตี
  • นักสืบ (a 1) สามารถโจมตีโดยใช้กลไกปกติ แต่พวกเขายังสามารถลอง "เดา" ยศของผู้เล่นคนอื่นซึ่งสามารถใช้แทนสัญกรณ์ที่มีสติได้
  • ถ้าพวกเขาคิดว่าถูกต้องชิ้นอื่น ๆ ["1(5)", "5"] -> ["1"]ที่ตาย:
  • หากพวกเขาเดาผิดไม่มีอะไรเกิดขึ้น: ["1(3)", "5"] -> ["1", "5"].
  • ["1(B)", "B"] -> ["1"]สังเกตการณ์สามารถจุดระเบิด:

นี่คือดังนั้นรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ!

(คุณสามารถใช้ตัวอย่างเป็นกรณีทดสอบได้เพราะฉันขี้เกียจเกินกว่าที่จะรวบรวมพวกมันทั้งหมดไว้ในรายการเดียว)


เราสามารถใช้ 0 และ 11 เพื่อแทน S และ B ตามลำดับได้หรือไม่
Leun Nun

@LeakyNun ไม่นั่นจะทำให้การจัดอันดับมันง่ายเกินไป
Maltysen

1
ฉันรู้เกี่ยวกับการพลิกกลับของอันดับ (1s เคยเป็นที่ดีที่สุดพ่ายแพ้โดยการโจมตีสายลับ 8s เป็นคนงานเหมืองและ 9s เป็นคนที่แย่ที่สุด) แต่ฉันไม่เคยได้ยินเกี่ยวกับอันดับนักสืบหรือกฎเดาและคุณชนะ แต่นั่นเป็นเพียงฉันพูดพล่าม ที่น่าสนใจจริง ๆ ที่นี่: แล้วธงล่ะ
msh210

1
@ msh210 ฉันกำลังพิจารณาที่จะมีผลลัพธ์"Victory!"สำหรับพวกเขา แต่ไม่ต้องการที่จะทำให้สิ่งต่าง ๆ ยุ่งยากมากเกินไป
Maltysen

สายลับจะไม่ชนะการต่อสู้ใด ๆ (ถ้าการโจมตีครั้งเดียว) ยกเว้นการวางระเบิดและป้องกันการสูญเสียทั้งหมดหรือไม่ และสิ่งนี้เป็นชุดของกฎ Stratego สปอตเตอร์ (แมวมอง) จะเป็น2s และไม่มี1เกม s ในกลยุทธ์ของฉัน ... (หรือพวกเขาเพิ่งปรับเปลี่ยนเพื่อจุดประสงค์ของการท้าทาย?)
mbomb007

คำตอบ:


3

Haskell, 131 ไบต์

วิธีการแก้ปัญหานี้อยู่ในรูปแบบของฟังก์ชั่นมัด#กับประเภทString -> String -> String

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

โซลูชันเดิมของฉันโชคไม่ดีที่ bugged และการแก้ไขทำให้ฉันเสียค่าใช้จ่ายไปสักสองสามไบต์

('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 ไบต์

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]

ฟังก์ชั่นนี้ใช้ผู้โจมตีกองหลังและเป็นทางเลือกในการเดาของนักสืบ (ถ้าผู้โจมตีคือนักสืบ) มันส่งกลับอาร์เรย์ที่มีชิ้นส่วนที่ยังมีชีวิตอยู่

Ungolfed

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]

การสาธิต

https://repl.it/C6Oz/2


([a,d],[a])[g==d]->[a,d][:(g!=d)+1]
Leun Nun

@Leaky Nun - ขอบคุณและ [a] + [d] * (g == d) ยังสั้นกว่า
Chuck Morris

1

Javascript ES6, 98 86 ไบต์

(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

รับ 3 args (ผู้โจมตีกองหลังผู้สปอตเตอร์เดา)

ตัวอย่างการทำงาน:

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
หากคุณไม่ต้องการส่งคืนอาร์เรย์คุณสามารถบันทึกจำนวนหนึ่งไบต์
ไม่ใช่ว่า Charles

รหัสของคุณทำงานไม่ถูกต้องสำหรับฉันเมื่อนักสืบไม่สามารถเดาได้ มากกว่าf("1","10") -> ["1","10"] "10"
ankh-morpork

0

Javascript, 179 166 160 ไบต์

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

ฟังก์ชั่นนี้ใช้เวลา 3 ข้อโต้แย้ง - อันดับแรกคือผู้โจมตีส่วนที่สองใช้สำหรับผู้สังเกตการณ์ (ผู้เดา) และผู้ที่สามคือผู้พิทักษ์

ไอคอนดาบมาจากcliparts.co


0

TSQL, 162 124 ไบต์

แข็งแรงเล่นกอล์ฟ:

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,@)))))

Ungolfed:

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,@)))))

ซอ

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