Valuta una battaglia strategica


11

Nel gioco Stratego, la meccanica di gioco principale è quando attacchi un pezzo dell'avversario con il tuo. In questa sfida, il tuo compito è simulare una di queste battaglie e dire chi sopravvive.

Specifiche

Otterrai come input una coppia di stringhe che rappresentano pezzi di Stratego. I pezzi sono uno dei "S 1 2 3 4 5 6 7 8 9 10 B"( Sè la spia e Bsono bombe). Il primo della coppia sarà l'attaccante, e il secondo sarà l'attaccante.

Ecco le regole per determinare i risultati di una battaglia:

  • Il numero più alto batte il numero più basso: ["4", "6"] -> ["6"].
  • Se entrambi sono gli stessi, allora entrambi dado: ["7", "7"] -> [].
  • Le spie sono in fondo, al di sotto anche 1: ["S", "2"] -> ["2"].
  • Tuttavia, se una spia attacca il 10, poi la spia vince: ["S", "10"] -> ["S"].
  • Ma le normali regole si applicano ancora, se l' 10è quella di attaccare: ["10", "S"] -> ["10"].
  • Semmai attacca una bomba, la bomba vince: ["5", "B"] -> ["B"].
  • Tuttavia, un minatore (una 3), in grado di disinnescare una bomba: ["3", "B"] -> ["3"].
  • Una bomba non sarà mai l'attaccante.
  • Uno spotter (a 1), può attaccare usando il normale meccanismo, ma può anche provare a "indovinare" il rango dell'altro giocatore, che può essere indicato con qualsiasi notazione sana.
  • Se si indovinano, l'altro pezzo muore: ["1(5)", "5"] -> ["1"].
  • Se si sbaglia, non accade nulla: ["1(3)", "5"] -> ["1", "5"].
  • Spotters può individuare bombe: ["1(B)", "B"] -> ["1"].

Questo è , quindi vince il codice più breve in byte !

(Puoi usare gli esempi lassù come casi di test, perché sono troppo pigro per metterli tutti insieme in un elenco).


possiamo usare 0 e 11 per rappresentare S e B rispettivamente?
— Leaky Nun,

@LeakyNun no, sarebbe troppo facile classificarli.
— Maltysen,

1
Conoscevo l'inversione dei ranghi (1 era il migliore, battuto solo dalle spie d'attacco, 8 erano minatori e 9 erano i peggiori), ma non avevo mai sentito parlare del rango spotter o della regola di indovinare e vincere. Ma sono solo io che borbotta. Di reale interesse qui: che dire delle bandiere?
— msh210,

1
@ msh210 Stavo pensando di avere un risultato "Victory!"per loro, ma non volevo complicare troppo le cose
— Maltysen,

Una spia non vince alcuna battaglia (se quella che attacca), ad eccezione di una bomba, e perde tutte le difese? E da quale serie di regole Stratego proviene? Gli Spotters (Scout) sarebbero 2s, e non c'erano 1s nel mio gioco Stratego ... (o sono stati appena modificati ai fini della sfida?)
— mbomb007,

Risposte:


3

Haskell, 131 byte

Questa soluzione ha la forma di una funzione infix #con typeString -> String -> String

L'input è accettato attraverso i due argomenti di stringa. Il formato per l'input dello spotter è 1 xdove xè l'ipotesi. L'output è dato come una stringa. Nel caso in cui entrambe le unità sopravvivano, la stringa restituita contiene entrambe separate da uno spazio.

Purtroppo la mia soluzione originale era stata risolta e la correzione mi costava pochi 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

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]

La funzione prende l'attaccante, il difensore e facoltativamente l'ipotesi dello spotter (se l'attaccante è lo spotter) come argomenti. Restituisce un array contenente i pezzi live che rimangono.

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]

dimostrazione

https://repl.it/C6Oz/2


([a,d],[a])[g==d]->[a,d][:(g!=d)+1]
— Leaky Nun,

@Leaky Nun - Grazie, e [a] + [d] * (g == d) è ancora più corto.
— 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

Accetta 3 argomenti (attaccante, difensore, ipotesi di spotter).

Esempi di esecuzione:

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
Se non è necessario restituire un array, è possibile salvare una manciata di byte.
— Non che Charles il

Il tuo codice non funziona correttamente per me quando uno spotter non fa un'ipotesi. f("1","10") -> ["1","10"]piuttosto che "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]}

Questa funzione accetta 3 argomenti: il primo è un attaccante, il secondo è usato per gli osservatori (la loro ipotesi) e il terzo è difensore.

L'icona della spada proviene da cliparts.co


0

TSQL, 162 124 byte

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

Violino

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.