Mengevaluasi Pertempuran Stratego

11

Dalam permainan Stratego, mekanik permainan utama adalah ketika Anda menyerang bagian lawan dengan milik Anda. Dalam tantangan ini, tugas Anda adalah mensimulasikan salah satu pertempuran ini dan mengatakan siapa yang selamat.

Spesifikasi

Anda akan mendapatkan sepasang string yang mewakili potongan Stratego. Potongan adalah salah satunya "S 1 2 3 4 5 6 7 8 9 10 B"( Sadalah Spy, dan Badalah bom). Yang pertama dari pasangan akan menjadi penyerang, dan yang kedua diserang.

Berikut adalah aturan untuk menentukan hasil pertempuran:

  • Jumlah yang lebih tinggi mengalahkan angka yang lebih rendah: ["4", "6"] -> ["6"].
  • Jika keduanya sama, maka kedua die: ["7", "7"] -> [].
  • Spies berada di bagian bawah, bawah bahkan 1: ["S", "2"] -> ["2"].
  • Namun, jika mata-mata menyerang 10, maka mata-mata menang: ["S", "10"] -> ["S"].
  • Tapi aturan normal masih berlaku jika 10adalah satu menyerang: ["10", "S"] -> ["10"].
  • Jika sesuatu menyerang bom, bom menang: ["5", "B"] -> ["B"].
  • Namun, penambang (a 3), dapat meredakan bom: ["3", "B"] -> ["3"].
  • Sebuah bom tidak akan pernah menjadi penyerangnya.
  • Seorang pengintai (a 1), dapat menyerang menggunakan mekanisme normal, tetapi mereka juga dapat mencoba untuk "menebak" peringkat pemain lain, yang dapat dilambangkan dengan notasi waras.
  • Jika mereka menebak dengan benar, bagian lainnya meninggal: ["1(5)", "5"] -> ["1"].
  • Jika mereka salah menebak, tidak ada yang terjadi: ["1(3)", "5"] -> ["1", "5"].
  • Pengadu bisa melihat bom: ["1(B)", "B"] -> ["1"].

Ini adalah , jadi kode terpendek dalam byte menang!

(Anda dapat menggunakan contoh di atas sebagai kasus uji, karena saya terlalu malas untuk menggabungkan semuanya dalam satu daftar).

Maltysen
sumber
dapatkah kita menggunakan 0 dan 11 untuk masing-masing mewakili S dan B?
Leaky Nun
@ LeakyNun tidak, itu akan membuat peringkat mereka terlalu mudah.
Maltysen
1
Saya tahu tentang pembalikan peringkat (dulu adalah yang terbaik, hanya dikalahkan dengan menyerang mata-mata, 8 adalah penambang, dan 9 adalah yang terburuk), tetapi saya tidak pernah mendengar tentang peringkat pengintai atau aturan tebak-dan-menang. Tapi itu hanya aku yang mengoceh. Yang menarik di sini: Bagaimana dengan bendera?
msh210
1
@ msh210 Saya sedang mempertimbangkan memiliki output "Victory!"untuk mereka, tetapi tidak ingin terlalu
menyulitkan
Bukankah Spy memenangkan pertempuran apapun (jika yang menyerang), dengan pengecualian Bom, dan kehilangan semua pertahanan? Dan dari mana aturan Stratego ini berasal? Pengadu (Scouts) akan menjadi 2s, dan tidak ada 1dalam game Stratego saya ... (atau apakah mereka hanya dimodifikasi untuk tujuan tantangan?)
mbomb007

Jawaban:

3

Haskell, 131 byte

Solusi ini dalam bentuk fungsi infiks #dengan tipeString -> String -> String

Input diterima melalui dua argumen string. Format untuk input spotter adalah di 1 xmana xtebakannya. Output diberikan sebagai string. Dalam kasus di mana kedua unit bertahan, string yang dikembalikan berisi keduanya dipisahkan oleh spasi.

Solusi asli saya sayangnya disadap dan biaya perbaikan saya beberapa 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
ankh-morpork
sumber
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]

Fungsi mengambil penyerang, pembela dan opsional menebak pengintai (jika penyerang adalah pengintai) sebagai argumen. Ini mengembalikan array yang berisi potongan hidup yang tersisa.

Tidak disatukan

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]

Demo

https://repl.it/C6Oz/2

Chuck Morris
sumber
([a,d],[a])[g==d]->[a,d][:(g!=d)+1]
Leaky Nun
@Leaky Nun - Terima kasih, dan [a] + [d] * (g == d) masih lebih pendek.
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

Terima 3 args (penyerang, bek, pengadu spotter).

Contoh berjalan:

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"
Dendrobium
sumber
1
Jika Anda tidak perlu mengembalikan array, Anda dapat menyimpan beberapa byte.
Bukan itu Charles
Kode Anda tidak berfungsi dengan benar untuk saya ketika seorang spotter tidak menebak. f("1","10") -> ["1","10"]bukannya "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]}

Fungsi ini membutuhkan 3 argumen - yang pertama adalah penyerang, yang kedua digunakan untuk pengadu (tebakan mereka) dan yang ketiga adalah bek.

Ikon pedang berasal dari cliparts.co

Jacajack
sumber
0

TSQL, 162 124 byte

Golf:

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

Tidak Disatukan:

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

Biola

t-clausen.dk
sumber