Oceń bitwę Stratego

11

W grze Stratego główną mechaniką gry jest atakowanie pionka przeciwnika swoim. W tym wyzwaniu Twoim zadaniem jest zasymulowanie jednej z tych bitew i określenie, kto przeżyje.

Okular

Otrzymasz jako dane wejściowe parę sznurków reprezentujących kawałki Stratego. Kawałki są jednym z "S 1 2 3 4 5 6 7 8 9 10 B"( Sjest Szpiegiem i Bjest bombą). Pierwszą z nich będzie atakujący, a drugą zaatakowany.

Oto zasady określania wyników bitwy:

  • Im wyższa liczba bije niższą liczbę: ["4", "6"] -> ["6"].
  • Jeśli oba są takie same, to zarówno matryca: ["7", "7"] -> [].
  • Szpiedzy są na dole, pod spodem jeszcze 1: ["S", "2"] -> ["2"].
  • Jednakże, jeśli szpiegiem atakuje 10, to szpieg wygrywa: ["S", "10"] -> ["S"].
  • Ale normalne zasady nadal obowiązują, jeśli 10jest jeden atakuje: ["10", "S"] -> ["10"].
  • Jeśli coś atakuje bomba, bomba wygrywa: ["5", "B"] -> ["B"].
  • Jednak górnik (a 3), można rozbroić bomby ["3", "B"] -> ["3"].
  • Bomba nigdy nie będzie atakującym.
  • Spotter (a 1) może atakować za pomocą normalnego mechanizmu, ale może także próbować „odgadnąć” pozycję drugiego gracza, którą można oznaczyć dowolnym rozsądnym zapisem.
  • Jeśli oni odgadnąć poprawnie, drugi kawałek pieczątki: ["1(5)", "5"] -> ["1"].
  • Jeśli źle się domyślić, nic się nie dzieje: ["1(3)", "5"] -> ["1", "5"].
  • Spotters można dostrzec bomby: ["1(B)", "B"] -> ["1"].

To jest , więc wygrywa najkrótszy kod w bajtach !

(Możesz użyć tych przykładów jako przypadków testowych, ponieważ jestem zbyt leniwy, aby zebrać je wszystkie w jedną listę).

Maltysen
źródło
czy możemy użyć 0 i 11 do przedstawienia odpowiednio S i B?
Leaky Nun
@LeakyNun nie, to ułatwiłoby ich uszeregowanie.
Maltysen
1
Wiedziałem o odwróceniu rang (jedne były najlepsze, pobite tylko przez atakujących szpiegów, ósemki były górnikami, a dziewiątki były najgorsze), ale nigdy nie słyszałem o randze obserwatora ani o zasadzie zgadywania i wygrywania. Ale to tylko ja paplanie. Rzeczywiste zainteresowanie tutaj: co z flagami?
msh210
1
@ msh210 Zastanawiałem się nad wyjściem "Victory!"dla nich, ale nie chciałem zbytnio komplikować rzeczy
Maltysen
Czy Szpieg nie wygrywa żadnej bitwy (jeśli atakuje), z wyjątkiem Bomby, i nie traci żadnej obrony? I z jakiego zestawu reguł Stratego to pochodzi? Spotterzy (Zwiadowcy) byliby 2s i nie było żadnych 1s w mojej grze Stratego ... (czy są one tylko modyfikowane na potrzeby wyzwania?)
mbomb007

Odpowiedzi:

3

Haskell, 131 bajtów

To rozwiązanie ma postać funkcji infiksowej #z typemString -> String -> String

Dane wejściowe są akceptowane przez dwa argumenty łańcuchowe. Format wejścia Spotter to 1 xgdzie xjest guess.Output jest podana jako ciąg znaków. W przypadku, gdy obie jednostki przetrwają, zwrócony ciąg zawiera obie oddzielone spacją.

Moje oryginalne rozwiązanie zostało niestety naprawione, a poprawka kosztowała mnie kilka bajtów.

('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
źródło
1

Python, 180 153 bajtów

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]

Ta funkcja przyjmuje argumenty atakującego, obrońcy i opcjonalnie zgadywającego (jeśli atakujący jest obserwatorem). Zwraca tablicę zawierającą żywe fragmenty, które pozostały.

Nie golfił

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]

Próbny

https://repl.it/C6Oz/2

Chuck Morris
źródło
([a,d],[a])[g==d]->[a,d][:(g!=d)+1]
Leaky Nun
@Leaky Nun - Dzięki, a [a] + [d] * (g == d) jest jeszcze krótszy.
Chuck Morris
1

JavaScript ES6, 98 86 bajtów

(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

Akceptuje 3 argumenty (atakujący, obrońca, zgadywanie).

Przykładowe przebiegi:

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
źródło
1
Jeśli nie musisz zwracać tablicy, możesz zapisać garść bajtów.
Nie to, że Charles
Twój kod nie działa dla mnie poprawnie, gdy obserwator nie zgaduje. f("1","10") -> ["1","10"]raczej niż "10".
ankh-morpork
0

JavaScript, 179 166 160 bajtów

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

Ta funkcja przyjmuje 3 argumenty - pierwszy to atakujący, drugi służy do obserwatorów (ich przypuszczenie), a trzeci to obrońca.

Ikona miecza pochodzi z cliparts.co

Jacajack
źródło
0

TSQL, 162 124 bajty

Gra w golfa:

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

Nie golfowany:

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

Skrzypce

t-clausen.dk
źródło