评估战略战斗


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"]
  • 但是,矿工(a 3)可以化解炸弹:["3", "B"] -> ["3"]
  • 炸弹永远不会成为攻击者。
  • 监视者(a 1)可以使用常规机制进行攻击,但是他们也可以尝试“猜测”其他玩家的等级,可以用任何理智的符号表示。
  • 如果他们猜对了,另一片死亡:["1(5)", "5"] -> ["1"]
  • 如果他们猜错了,则不会发生任何事情:["1(3)", "5"] -> ["1", "5"]
  • 观察者可以发现炸弹:["1(B)", "B"] -> ["1"]

这是,因此以字节为单位的最短代码胜出!

(您可以将此处的示例用作测试用例,因为我太懒了,无法将它们全部放在一个列表中)。


我们可以分别用0和11表示S和B吗?
Leaky Nun

@LeakyNun不,这会使对它们进行排名太容易了。
Maltysen,2016年

1
我知道等级的逆转(过去最好是1,只被间谍攻击打败,矿工是8,最差是9),但我从未听说过检举人的等级或猜中取胜的规则。但这只是我胡扯。在这里真正感兴趣的是:标志呢?
msh210 '16

1
@ msh210我当时正在考虑"Victory!"为它们提供输出,但不想让事情变得过于复杂
-Maltysen

间谍除了炸弹以外,不会赢得任何战斗(如果有人攻击)并且失去所有防御?这是哪套Stratego规则的来源?Spotters(Scouts)是2s,而1我的Stratego游戏中没有s ...(或者只是为了挑战而修改了它们吗?)
mbomb007

Answers:


3

Haskell,131个字节

此解决方案#采用类型为infix的函数的形式String -> String -> String

通过两个字符串参数接受输入。查看器输入的格式是猜测1 x所在x,输出以字符串形式给出。如果两个单元都存在,则返回的字符串包含两者,并以空格分隔。

不幸的是,我原来的解决方案有错误,修复程序花了我几个字节。

('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]

该函数将攻击者,防御者和观察者的猜测(如果攻击者是观察者)作为参数。它返回一个包含剩余活动片段的数组。

不打高尔夫球

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]
Leaky Nun

@Leaky Nun-谢谢,[a] + [d] *(g == d)仍然更短。
查克·莫里斯

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, 162124字节

打高尔夫球:

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

取消高尔夫:

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

小提琴

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.