Stratego Savaşını Değerlendirin


11

Stratego oyununda, ana oyun tamircisi rakibinizin parçasına sizinkine saldırdığınız zamandır. Bu meydan okumada, işiniz bu savaşlardan birini simüle etmek ve kimin hayatta kaldığını söylemek.

gözlük

Giriş olarak Stratego parçalarını temsil eden bir çift dize alırsınız. Parçalar "S 1 2 3 4 5 6 7 8 9 10 B"( SCasus ve Bbomba) biridir. Çiftin birincisi saldırgan, ikincisi ise saldırgan olacaktır.

Bir savaşın sonuçlarını belirlemek için kurallar şunlardır:

  • Yüksek sayı daha az sayıda yener: ["4", "6"] -> ["6"].
  • Her ikisi de aynı, daha sonra her iki kalıp ise: ["7", "7"] -> [].
  • Casuslar altında bile, alt kısmındadır 1: ["S", "2"] -> ["2"].
  • Bir casus saldırırsa Ancak 10, daha sonra casus kazanır: ["S", "10"] -> ["S"].
  • Ama eğer, normal kuralları hala geçerli 10saldıran biridir: ["10", "S"] -> ["10"].
  • Şey bir bomba saldırırsa, bomba kazanır: ["5", "B"] -> ["B"].
  • Ancak, madenci (a 3), bir bombayı etkisiz hale edebilirsiniz: ["3", "B"] -> ["3"].
  • Bir bomba asla saldırgan olmayacak.
  • Bir gözlemci (a 1) normal mekanizmayı kullanarak saldırabilir, ancak aynı zamanda diğer oyuncuların sırasını "tahmin etmeye" çalışabilir.
  • Onlar doğru tahmin ederse, diğer parça ölür: ["1(5)", "5"] -> ["1"].
  • Onlar yanlış tahmin ederse, hiçbir şey olmaz: ["1(3)", "5"] -> ["1", "5"].
  • Spotters bombaları tespit edebilirsiniz: ["1(B)", "B"] -> ["1"].

Bu , bayt en kısa kod kazanır!

(Buradaki örnekleri test senaryoları olarak kullanabilirsiniz, çünkü hepsini tek bir listede bir araya getirmek için çok tembelim).


S ve B'yi temsil etmek için sırasıyla 0 ve 11 kullanabilir miyiz?
Leaky Nun

@LeakyNun hayır, bu onları sıralamayı çok kolay hale getirir.
Maltysen

1
Rütbeleri tersine çevirmeyi biliyordum (1'ler en iyiydi, sadece casuslara saldırarak dövüldü, 8'ler madencilerdi ve 9'lar en kötüydü), ama asla gözcü rütbesini veya tahmin-ve-kazan-kazan kuralını duymadım. Ama bu sadece ben gevezelik ediyor. Burada asıl ilgi çekici olan: Peki ya bayraklar?
msh210

1
@ msh210 Onlar için bir çıktı almayı düşünüyordum "Victory!", ama işleri çok fazla karmaşıklaştırmak istemedim
Maltysen

Bir Spy bomba dışında herhangi bir savaşı kazanmaz (saldırıyorsa) ve tüm savunmaları kaybetmez mi? Ve bu hangi Stratego kuralları kümesinden? Spotters (İzciler) olacağını 2ler ve hiçbir vardı 1ler ... benim Stratego oyunda (ya da sadece meydan amacıyla değiştiriliyor?)
mbomb007

Yanıtlar:


3

Haskell, 131 bayt

Bu çözüm #türüne sahip bir infix işlevi biçimindedirString -> String -> String

Girdi iki dize bağımsız değişkeni ile kabul edilir. Gözcü girişinin formatı tahminin olduğu 1 xyerdir x. Çıkış bir dize olarak verilir. Her iki birimin de hayatta kalması durumunda, döndürülen dize her ikisini de boşlukla ayrılmış olarak içerir.

Benim orijinal çözüm maalesef dinlenmişti ve düzeltme bana birkaç bayt maliyeti.

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

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]

İşlev saldırgan, savunmacı ve isteğe bağlı olarak gözlemcinin tahminini (saldırgan gözlemciyse) bağımsız değişken olarak alır. Kalan canlı parçaları içeren bir dizi döndürür.

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]

gösteri

https://repl.it/C6Oz/2


([a,d],[a])[g==d]->[a,d][:(g!=d)+1]
Sızdıran Rahibe

@Leaky Nun - Teşekkürler ve [a] + [d] * (g == d) daha kısadır.
Chuck Morris

1

Javascript ES6, 98 86 bayt

(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 argümanı kabul eder (saldırgan, defans oyuncusu, gözcü tahmini).

Örnek çalıştırmalar:

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
Bir dizi döndürmeniz gerekmiyorsa, bir avuç bayt kaydedebilirsiniz.
Charles

Bir gözcü tahmin edemediğinde kodunuz benim için doğru çalışmıyor. f("1","10") -> ["1","10"]yerine "10".
ankh-morpork

0

JavaScript, 179 166 160 bayt

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

Bu işlev 3 argüman alır - birincisi saldırgan, ikincisi tespit edenler için kullanılır (tahminleri) ve üçüncüsü savunucudur.

Kılıç simgesi cliparts.co'dan geliyor


0

TSQL, 162 124 bayt

golfed:

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

Vaktini boşa harcamak

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.