Evaluar una batalla de Stratego

11

En el juego Stratego, la mecánica principal del juego es cuando atacas la pieza de un oponente con la tuya. En este desafío, tu trabajo es simular una de estas batallas y decir quién sobrevive.

Especificaciones

Obtendrá como entrada un par de cuerdas que representan piezas de Stratego. Las piezas son una de ellas "S 1 2 3 4 5 6 7 8 9 10 B"( Ses el espía, y Bson bombas). El primero del par será el atacante, y el segundo el atacado.

Estas son las reglas para determinar los resultados de una batalla:

  • El número más alto es mejor que el número más bajo: ["4", "6"] -> ["6"].
  • Si ambos son la misma, entonces tanto troquel: ["7", "7"] -> [].
  • Los espías son en la parte inferior, por debajo incluso 1: ["S", "2"] -> ["2"].
  • Sin embargo, si un espía ataca el 10, entonces el espía gana: ["S", "10"] -> ["S"].
  • Pero las reglas normales todavía se aplican si el 10es el que ataca: ["10", "S"] -> ["10"].
  • Si hay algo que ataca a una bomba, la bomba gana: ["5", "B"] -> ["B"].
  • Sin embargo, un minero (a 3), puede desactivar una bomba: ["3", "B"] -> ["3"].
  • Una bomba nunca será el atacante.
  • Un observador (a 1) puede atacar usando el mecanismo normal, pero también puede tratar de "adivinar" el rango del otro jugador, lo que puede denotarse con cualquier notación sensata.
  • Si aciertan, la otra pieza muere: ["1(5)", "5"] -> ["1"].
  • Si adivinan mal, no pasa nada: ["1(3)", "5"] -> ["1", "5"].
  • Observadores pueden detectar bombas: ["1(B)", "B"] -> ["1"].

Este es el , por lo que gana el código más corto en bytes .

(Puede usar los ejemplos allí arriba como casos de prueba, porque soy demasiado vago para ponerlos todos juntos en una lista).

Maltysen
fuente
¿podemos usar 0 y 11 para representar S y B respectivamente?
Leaky Nun
@LeakyNun no, eso haría que sea demasiado fácil clasificarlos.
Maltysen
1
Sabía acerca de la reversión de los rangos (1s solía ser mejor, solo vencido por atacar a los espías, 8s eran mineros y 9s eran peores), pero nunca escuché sobre el rango de observador o la regla de adivinar y ganar. Pero solo soy yo balbuceando. De interés real aquí: ¿Qué pasa con las banderas?
msh210
1
@ msh210 Estaba considerando tener una salida "Victory!"para ellos, pero no quería complicar demasiado las cosas
Maltysen
¿Un espía no gana ninguna batalla (si está atacando), con la excepción de una bomba, y pierde todas las defensas? ¿Y de qué conjunto de reglas de Stratego es esto? Los observadores (Scouts) serían 2s, y no había 1s en mi juego Stratego ... (¿o simplemente se modifican para el desafío?)
mbomb007

Respuestas:

3

Haskell, 131 bytes

Esta solución tiene la forma de una función infija #con tipoString -> String -> String

La entrada se acepta a través de los dos argumentos de cadena. El formato para la entrada de spotter es 1 xdónde xestán las conjeturas. La salida se da como una cadena. En el caso de que ambas unidades sobrevivan, la cadena devuelta contiene ambas separadas por un espacio.

Lamentablemente, mi solución original estaba defectuosa y la solución me costó algunos bytes.

('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
fuente
1

Python, 180 153 bytes

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 función toma al atacante, defensor y, opcionalmente, la suposición del observador (si el atacante es el observador) como argumentos. Devuelve una matriz que contiene las piezas vivas que quedan.

Sin golf

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]

Manifestación

https://repl.it/C6Oz/2

Chuck Morris
fuente
([a,d],[a])[g==d]->[a,d][:(g!=d)+1]
Leaky Nun
@Leaky Nun: gracias, y [a] + [d] * (g == d) es aún más corto.
Chuck Morris
1

Javascript ES6, 98 86 bytes

(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

Acepta 3 args (atacante, defensor, adivinador).

Ejecuciones de ejemplo:

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
fuente
1
Si no necesita devolver una matriz, puede guardar un puñado de bytes.
No es que Charles
Su código no funciona correctamente para mí cuando un observador no hace una suposición. f("1","10") -> ["1","10"]en lugar de "10".
ankh-morpork
0

Javascript, 179 166 160 bytes

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

Esta función toma 3 argumentos: el primero es el atacante, el segundo se usa para los observadores (su suposición) y el tercero es el defensor.

El icono de la espada proviene de clipart.co

Jacajack
fuente
0

TSQL, 162 124 bytes

Golfizado:

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

Sin golf:

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

Violín

t-clausen.dk
fuente