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.