Оцените битву стратего

11

В игре Stratego основной игровой механизм - когда вы атакуете фигуру противника своей. В этой задаче вам предстоит смоделировать одну из этих битв и сказать, кто выживет.

Спекуляции

В качестве входных данных вы получите пару строк, представляющих фигуры Stratego. Кусочки являются одним из "S 1 2 3 4 5 6 7 8 9 10 B"( Sэто шпион и Bбомбы). Первый из пары будет атакующим, а второй атакованным.

Вот правила определения результатов битвы:

  • Чем выше число ударов меньшего числа: ["4", "6"] -> ["6"].
  • Если оба одинаковы, оба умирают ["7", "7"] -> [].
  • Шпионы находятся в нижней части , под еще 1: ["S", "2"] -> ["2"].
  • Однако, если шпион атакует 10, то шпион выигрывает: ["S", "10"] -> ["S"].
  • Но нормальные правила все еще применяются , если 10это один атакует: ["10", "S"] -> ["10"].
  • Если что-то атакует бомбу, бомба побеждает ["5", "B"] -> ["B"].
  • Тем не менее, шахтер (а 3) может обезвредить бомбу ["3", "B"] -> ["3"].
  • Бомба никогда не будет атакующим.
  • Споттер (а 1) может атаковать с помощью обычного механизма, но он также может попытаться «угадать» ранг другого игрока, который можно обозначить с помощью любой вменяемой записи.
  • Если они угадают правильно, другой кусок умирает ["1(5)", "5"] -> ["1"].
  • Если они ошибаются, ничего не происходит ["1(3)", "5"] -> ["1", "5"].
  • Spotters может обнаружить бомбы: ["1(B)", "B"] -> ["1"].

Это , поэтому выигрывает самый короткий код в байтах !

(Вы можете использовать примеры в качестве тестовых случаев, потому что мне лень собирать их все в один список).

Maltysen
источник
Можем ли мы использовать 0 и 11 для представления S и B соответственно?
Дрянная Монахиня
@ LeakyNun нет, это сделало бы их слишком легко ранжировать их.
Maltysen
1
Я знал об изменении рангов (1-е были лучшими, их избивали только атакующие шпионы, 8-е - шахтеры, а 9-е были худшие), но я никогда не слышал о ранжировщике или правиле «угадай и выиграй». Но это только я болтаю. Здесь интересен факт: флаги?
msh210
1
@ msh210 Я думал о том, чтобы получить выход "Victory!"для них, но не хотел слишком усложнять ситуацию
Maltysen
Разве шпион не выигрывает ни одного сражения (если тот атакует), за исключением бомбы, и теряет все защиты? И из какого набора правил Stratego это происходит? Споттеры (скауты) были бы 2s, и 1в моей игре
Stratego

Ответы:

3

Haskell, 131 байт

Это решение в форме инфиксной функции #с типомString -> String -> String

Ввод принимается через два строковых аргумента. Формат для ввода корректирующего сигнала - 1 xгде xугадайте. Выходные данные задаются в виде строки. В случае, когда оба блока выживают, возвращаемая строка содержит оба, разделенные пробелом.

Мое оригинальное решение, к сожалению, было ошибочным, и исправление стоило мне несколько байтов.

('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 байта

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]

Функция принимает в качестве аргументов атакующего, защитника и, возможно, догадку наблюдателя (если атакующий является наблюдателем). Возвращает массив, содержащий живые фрагменты, которые остались.

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]

демонстрация

https://repl.it/C6Oz/2

Чак Моррис
источник
([a,d],[a])[g==d]->[a,d][:(g!=d)+1]
Дрянная Монахиня
@Leaky Nun - Спасибо, и [a] + [d] * (g == d) еще короче.
Чак Моррис
1

Javascript ES6, 98 86 байт

(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

Принимает 3 аргумента (атакующий, защитник, догадчик).

Пример работы:

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
источник
1
Если вам не нужно возвращать массив, вы можете сохранить несколько байтов.
Не то чтобы Чарльз
Ваш код не работает правильно для меня, когда наблюдатель не делает предположения. f("1","10") -> ["1","10"]а не "10".
ankh-morpork
0

Javascript, 179 166 160 байт

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

Эта функция принимает 3 аргумента: первый - атакующий, второй - для наблюдателей (их предположение), а третий - защитник.

Значок меча прибывает из cliparts.co

Jacajack
источник
0

TSQL, 162 124 байта

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

скрипка

t-clausen.dk
источник