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).


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

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


([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"

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


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.