Avalie uma batalha estratégica

11

No jogo Stratego, a principal mecânica do jogo é quando você ataca a peça de um oponente com a sua. Nesse desafio, seu trabalho é simular uma dessas batalhas e dizer quem sobrevive.

Especificações

Você receberá como entrada um par de strings representando as peças do Stratego. As peças são uma das "S 1 2 3 4 5 6 7 8 9 10 B"( Sé o Spy e Bsão bombas). O primeiro do par será o atacante e o segundo o atacado.

Aqui estão as regras para determinar os resultados de uma batalha:

  • O número mais elevado bate o menor número: ["4", "6"] -> ["6"].
  • Se ambos são os mesmos, então ambos morrer: ["7", "7"] -> [].
  • Spies estão na parte inferior, por baixo mesmo 1: ["S", "2"] -> ["2"].
  • No entanto, se um espião ataca o 10, em seguida, o espião ganha: ["S", "10"] -> ["S"].
  • Mas as regras normais ainda se aplicam se o 10é o ataque: ["10", "S"] -> ["10"].
  • Se alguma coisa ataca uma bomba, a bomba ganha: ["5", "B"] -> ["B"].
  • No entanto, um mineiro (a 3), pode desarmar uma bomba: ["3", "B"] -> ["3"].
  • Uma bomba nunca será o atacante.
  • Um observador (a 1) pode atacar usando o mecanismo normal, mas também pode tentar "adivinhar" a classificação do outro jogador, o que pode ser indicado com qualquer notação sensata.
  • Se eles adivinhar corretamente, o outro pedaço morre: ["1(5)", "5"] -> ["1"].
  • Se errar, nada acontece: ["1(3)", "5"] -> ["1", "5"].
  • Spotters pode detectar bombas: ["1(B)", "B"] -> ["1"].

Isso é , então o código mais curto em bytes vence!

(Você pode usar os exemplos lá em cima como casos de teste, porque tenho preguiça de reuni-los todos em uma lista).

Maltysen
fonte
podemos usar 0 e 11 para representar S e B, respectivamente?
Freira vazada
@LeakyNun não, isso tornaria muito fácil classificá-los.
Maltysen
1
Eu sabia sobre a inversão de posições (1s costumava ser o melhor, derrotado apenas por espiões atacantes, 8s eram mineiros e 9s eram os piores), mas nunca ouvi falar no ranking de observadores ou na regra de adivinhar e vencer. Mas isso é só eu balbuciando. De interesse real aqui: E as bandeiras?
Msh210
1
@ msh210 eu estava pensando em ter uma produção de "Victory!"para-los, mas não queria coisas complicar demais
Maltysen
Um Spy não vence nenhuma batalha (se a atacar), com exceção de uma Bomba, e perde todas as defesas? E de que conjunto de regras do Stratego é isso? Spotters (Scouts) seria 2s, e não houve 1s no meu jogo Stratego ... (ou são apenas modificado para o propósito do desafio?)
mbomb007

Respostas:

3

Haskell, 131 bytes

Esta solução está na forma de uma função infix #com o tipoString -> String -> String

A entrada é aceita através dos dois argumentos de cadeia. O formato da entrada do observador é 1 xonde xestá o palpite. A saída é fornecida como uma sequência. No caso em que ambas as unidades sobrevivem, a sequência retornada contém as duas separadas por um espaço.

Infelizmente, minha solução original foi corrigida e a correção me custou alguns 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
fonte
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]

A função assume o atacante, o defensor e, opcionalmente, o palpite do observador (se o atacante for o observador) como argumentos. Retorna uma matriz contendo as peças vivas que permanecem.

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]

Demo

https://repl.it/C6Oz/2

Chuck Morris
fonte
([a,d],[a])[g==d]->[a,d][:(g!=d)+1]
Freira Furada
@ Freira Fria - Obrigado, e [a] + [d] * (g == d) ainda é mais curto.
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

Aceita 3 args (atacante, defensor, palpite do observador).

Exemplo é executado:

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
fonte
1
Se você não precisar retornar uma matriz, poderá salvar um punhado de bytes.
Não que Charles,
Seu código não está funcionando corretamente para mim quando um observador não faz um palpite. f("1","10") -> ["1","10"]ao invés 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 função recebe 3 argumentos - o primeiro é o atacante, o segundo é usado para observadores (o palpite) e o terceiro é o defensor.

O ícone espada é de cliparts.co

Jacajack
fonte
0

TSQL, 162 124 bytes

Golfe:

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

t-clausen.dk
fonte