Оцініть битву Стратего


11

У грі «Стратего» головний ігровий механік - це коли ти нападаєш на шматок суперника своїм. У цьому завданні вам належить завдання змоделювати одну з цих битв і сказати, хто виживає.

Технічні характеристики

Ви отримаєте як вхід пару рядків, що представляють шматки Стратего. Шматки є одним із "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"].
  • Бомба ніколи не стане нападником.
  • Споттер (a 1) може атакувати, використовуючи звичайний механізм, але вони також можуть спробувати «відгадати» ранг іншого гравця, який може бути позначений будь-якими нормальними позначеннями.
  • Якщо вони правильно вгадати, інша частина вмирає: ["1(5)", "5"] -> ["1"].
  • Якщо вони здогадатися не так, нічого не відбувається: ["1(3)", "5"] -> ["1", "5"].
  • Spotters може виявити бомби: ["1(B)", "B"] -> ["1"].

Це , тому найкоротший код у байтах виграє!

(Ви можете використовувати приклади там як тестові випадки, тому що я лінивий, щоб скласти їх усі в один список).


чи можемо ми використовувати 0 і 11 для подання S і B відповідно?
Leaky Nun

@LeakyNun ні, це зробило б занадто легко їх класифікацію.
Малтісен

1
Я знав про зміну рангів (1-го колись найкраще, били лише атакуючих шпигунів, 8-х - шахтарі, а 9-ті - найгірші), але я ніколи не чув про ранг споттера та правила здогадки та перемоги. Але це лише мене лепетання. Тут насправді цікаво: як щодо прапорів?
msh210

1
@ msh210 Я розглядав можливість отримання результатів "Victory!"для них, але не хотів занадто ускладнювати речі
Maltysen

Хіба не шпигун виграє будь-яку битву (якщо той, хто атакує), за винятком Бомби, і не програє всі захисні сили? І з чого це набір правил Стратего? Колектори (розвідники) були б 2, а 1в моїй грі Стратего не було ... (чи вони просто модифіковані з метою виклику?)
mbomb007

Відповіді:


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

Пітон, 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]

Ця функція бере аргумент нападника, захисника і, необов'язково, здогаду споттера (якщо зловмисник є споттером). Він повертає масив, що містить живі фрагменти, які залишаються.

Безумовно

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]
Лина монашка

@Laaky 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"

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


0

TSQL, 162 124 байти

Гольф:

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

Безголівки:

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

Скрипка

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.