ストラテゴの戦いを評価する


11

ゲームStrategoでは、主なゲームメカニズムは、対戦相手のピースを自分のもので攻撃することです。このチャレンジでは、あなたの仕事はこれらの戦いの1つをシミュレートし、誰が生き残るかを言うことです。

スペック

入力として、Strategoピースを表す文字列のペアを取得します。ピースは"S 1 2 3 4 5 6 7 8 9 10 B"SスパイでありB、爆弾です)の1つです。ペアの最初は攻撃者で、2番目は攻撃されます。

戦闘の結果を決定するためのルールは次のとおりです。

  • 数値が大きいほど、小さい数値に勝ります["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"]

これはなので、バイト単位の最短コードが勝ちです!

(私はそれらをすべて1つのリストにまとめるのが面倒なので、テストケースとして上のサンプルを使用できます)。


SとBをそれぞれ表すために0と11を使用できますか?
リーキー修道女

@LeakyNunいいえ、それはそれらをランク付けするのが簡単になります。
マルティセン

1
ランクの逆転については知っていました(1が最高であり、スパイを攻撃することによってのみbeatられ、8がマイナーで、9が最悪でした)が、スポッターランクまたは当て推量ルールは聞いたことがありません。しかし、それは私だけのせせらぎです。ここで実際に興味深いのは、フラグについてはどうですか?
msh210

1
@ msh210私は"Victory!"彼らのために出力することを考えていましたが、物事をあまり複雑にしたくありませんでした
-Maltysen

スパイは、爆弾を除くすべての戦闘に勝ち(攻撃している場合)、すべての防御を失いますか?そして、これはStrategoルールのどのセットからのものですか?スポッター(Scouts)はsであり、Strategoゲームに21s はありませんでした(または、チャレンジの目的で変更されただけですか?)
mbomb007

回答:


3

Haskell、131バイト

この解決策は、型を持つ中置関数の#形式ですString -> String -> String

入力は2つの文字列引数を介して受け入れられます。スポッター入力の形式は、推測が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-ありがとう、[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つの引数(攻撃者、防御者、スポッター推測)を受け入れます。

実行例:

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
配列を返す必要がない場合は、少数のバイトを節約できます。
はないチャールズ

スポッターが推測を行わないと、コードが正しく機能しません。 f("1","10") -> ["1","10"]ではなく"10"
アンク-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つの引数を取ります。1つ目は攻撃者、2つ目はスポッター(推測)に使用され、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,@)))))

ゴルフをしていない:

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.