Щитовая стена


18

Историческая справка

Щитовая стена - это тактическая военная формация, которая восходит как минимум к 2500 году до нашей эры. Он состоял из воинов, накладывающих свои щиты на щиты своих спутников, образуя «стену». Привлекательность этой тактики проистекает из того факта, что даже самый неквалифицированный воин может сражаться в стене, если у него есть щит и оружие. Из-за близости стен было мало места для перемещения, и битва обычно превращалась в пушечный бой с острым оружием.

Соревнование

Ваша задача - создать программу или функцию, которая с учетом двух массивов / списков / векторов воинов в качестве входных данных решает исход битвы. Списки будут представлять собой однострочную стену щитов, и они будут следовать определенной записи:

Викинги:

У нордических воинов была сильная жажда битвы. В конце 8-го - середине 11-го веков датские викинги вторглись в королевства Британии в поисках богатства и обрабатываемой земли. Для решения этой задачи это воины викингов:

  • JARL: Обычно нашел ведущую свои человек от центра стены, Ярл были лидерами викинга орд. Получает 15 урона, чтобы умереть, и наносит 2 урона за раунд.
  • BErserker: Хотя фантазия сильно скручены образ берсерков, эти воины были известны сражаться в транс , как ярость без какой - либо защиты, кроме щитов. Получает 6 повреждений, чтобы умереть, и наносит 3 повреждения за раунд.
  • CHieftain: Вожди были богатыми людьми , которые имели свободные человек на их обслуживание. Они обычно получали бы великую славу и богатство в бою. Получает 10 урона, чтобы умереть, и наносит 2 урона за раунд.
  • The Free Men: Воины, которые служили вождю. Они поклялись сражаться за своих лордов до самой смерти. Получает 8 урона, чтобы умереть, и наносит 1 урон за раунд.
  • SKald: Skalds, обычно переводится как барда, были свободными людьми , которые были наняты , чтобы писать стихи, рассказы или песни о великих подвигах скандинавских воинов. Получает 8 урона, чтобы умереть, и дает каждому смежному воину 1 дополнительный урон. Скальды не наносят урона. Таким образом, воины не могут получить более 1 бонусного урона.

саксы:

Саксы пришли поселиться в Британии из континентальной Европы после падения Римской империи в 5 веке. Для целей этого испытания есть воины саксонцев:

  • EARL: Ealdormen , обычно называют Earls, были членами высшего дворянства. Они обычно держали большие участки земли и имели сотни или даже тысячи присяжных. Получает 20 урона, чтобы умереть, и наносит 1 урон за раунд.
  • KНочь: Из- за отсутствия лучшего термина, что рыцари были небольшие дворяне, владевшие участок земли. В большинстве случаев рыцари были присяжными слугами графа. Получает 10 урона, чтобы умереть, и наносит 2 урона за раунд.
  • В Warrior: Общие мужчины, как правило , мелкие дворяне без земли или крестьян, служивших рыцарь. Когда рядом с Рыцарем или Графом, у воинов есть бонус +1 к урону. Получает 8 урона, чтобы умереть, и наносит 2 урона за раунд.
  • FYRD: Фирд была милиция, как группа свободных людей, как правило , бедных фермеров, которые бы принести любое оружие (или оружие, как сельское хозяйство реализации) они должны были бороться в стене. Получает 5 урона, чтобы умереть, и наносит 1 урон за раунд.
  • В Priest: Священники были высоко оценены в начале саксонской культуры, являясь вестниками слов Бога. Жрецы получают 15 урона, чтобы умереть, и предотвращают до 1 урона каждому соседнему воину. Священники не наносят ущерба. Священники не могут предотвратить более 1 повреждения воина.

Стена

Стены встречаются в их центрах. Каждый раунд каждый воин назначает урон воину, находящемуся прямо перед ним, или, если перед ним нет живого воина, живому воину, находящемуся по диагонали с наименьшим количеством здоровья. Если есть галстук, выберите воина ближе к краю стены.

Пример:

Vikings
[M,M,M,B,B,C,J,C,B,B,M,M,M]
[F,F,F,W,W,K,E,K,W,W,F,F,F]
Saxons

To make matters easier, let's convert these walls into numbers:
Round 0:
 M M M B B C  J  C  B B M M M
[8,8,8,6,6,10,15,10,6,6,8,8,8]
[5,5,5,8,8,10,20,10,8,8,5,5,5]
 F F F W W K  E  K  W W F F F

Round 1: Notice that 2 of the Saxons' warriors are adjacent to Knights, so they have a +1 damage bonus.
 M M M B B C J  C B B M M M
[7,7,7,4,3,8,14,8,3,4,7,7,7]
 | | | | | | || | | | | | |
[4,4,4,5,5,8,18,8,5,5,4,4,4]
 F F F W W K E  K W W F F F

Round 2: 
 M M M B B C J  C B B M M M
[6,6,6,2,0,6,13,6,0,2,6,6,6]
 | | | | | | || | | | | | |
[3,3,3,2,2,6,16,6,2,2,3,3,3]
 F F F W W K E  K W W F F F

Round 3: Remember to collapse the arrays to account for dead warriors. Also, notice that the 2 outermost Fyrd are now attacking the diagonally adjacent viking. 
   M M M B C J  C B M M M
  [4,5,4,0,4,12,4,0,4,5,4]
  /| | | | | || | | | | |\
[2,2,2,1,0,4,14,4,0,1,2,2,2]
 F F F W W K E  K W W F F F

Round 4: Notice once again the saxon Warriors next to the Knights dealing 3 damage:
   M M M C J  C M M M
  [2,4,1,2,11,2,1,4,2]
  /| | | | || | | | |\
[2,1,1,0,2,12,2,0,1,1,2]
 F F F W K E  K W F F F
Round 5:
 M M M C J  C M M M
[1,3,0,0,10,0,0,3,1]
 | | | | || | | | |
[1,0,0,0,10,0,0,0,1]
 F F F K E  K F F F

Round 6: 
    M M J M M
   [1,2,9,2,1]
     \| | |/   
     [0,8,0]
      F E F
Rounds 7 and 8:
      M M J M M         M M J M M
     [1,2,8,2,1]       [1,2,8,2,1]
         \|/               \|/ 
         [4]               [0]
          E                 E  

Output: Viking victory.

Правила:

  • Применяются стандартные лазейки .
  • Вы можете использовать любой удобный метод ввода-вывода .
  • Это , поэтому выигрывает самый короткий код (в байтах на язык).
  • Вы не можете предполагать, что списки будут иметь одинаковую длину, но они всегда будут выравниваться в своих центрах (в каждом списке всегда будет нечетное количество воинов, если списки имеют разные размеры).
  • Вы можете вывести любое значение truey / falsey. Пожалуйста, укажите в своем ответе эквиваленты «Викинг / Саксонская победа».
  • Проигравший определяется, когда все воины стены мертвы.
  • Если вы когда-нибудь столкнетесь со стенами, которые не будут выровнены во время выполнения кода, выровняйте их как можно более центрально, оставив одного дополнительного воина на более длинной стене с правой стороны. Например:

      [M,M,M,J,M,M,M]
        [K,E,K,W];
    
          [B,B,B,J]    
    [K,K,W,W,K,E,K,W,W,K,K]
    
  • Не стесняйтесь пробовать и тестировать свой код с любыми настройками стен, а не только в тестовых примерах.

Тестовые случаи:

V: [M,M,B,C,B,C,J,C,B,C,B,M,M]
S: [F,F,W,K,W,K,E,K,W,K,W,F,F]
O: Viking victory.
------------------------------
V: [M,M,M,M,M,M,M,M,M,M]
S: [W,W,W,W,W,W,W,W,W,W]
O: Saxon victory.
------------------------------
V: [B,C,M,B,C,M,M,C,B,M,C,B,M]
S:   [W,F,W,F,E,E,E,F,W,F,W]
O: Viking victory.
------------------------------
V:         [B,B,B,J,B,B,B]
S: [W,W,W,W,K,K,K,E,K,K,K,W,W,W,W]
O: Saxon victory.
------------------------------
V: [J]
S: [E]
O: Viking victory.
------------------------------
V: [C,C,C,C,B,B,M,M,M,M,J,J,J,M,M,M,M,B,B,C,C,C,C]
S: [K,K,K,K,K,K,K,K,K,K,W,E,W,K,K,K,K,K,K,K,K,K,K]
O: Saxon victory.
------------------------------
V: [M,M,S,C,B,J,B,C,S,M,M]
S: [F,K,P,W,K,E,K,W,P,K,F]
O: Saxon victory.
------------------------------
V: [S,S,S,...,S]
S: [P,P,P,...,P]
O: UNDEFINED (since both priests and skalds deal no damage, you can output anything here.)
------------------------------

Есть некоторые исторические неточности. Не стесняйтесь указывать на них, и я сделаю все возможное, чтобы исправить их.



Можем ли мы определить другие символы вместо первых букв имен, например цифры 0-9?
NieDzejkob

@NieDzejkob уверен, вещь. Просто убедитесь, что вы указали в своем ответе, какие символы были использованы для какого воина.
J. Sallé

3
Будет ли считаться мошенничеством воспринимать ввод как их свойства, а не буквы? (пример как (health, damage, damagebonus, protbonus))
HyperNeutrino

@ HyperNeutrino Я не совсем уверен, но я думаю, что все будет в порядке? Я не понимаю, как это может дать вам большое преимущество. Как я сказал NieDzejkob, пока вы указываете в своем ответе, что представляет каждого воина, делайте это.
J. Sallé

Ответы:


3

Python 2 , 576 573 565 554 540 549 байт

O=[(0,0)]
g=lambda D,W,i:D[i-1]*(W[i-1]<1)+D[i]+D[i+1]*(W[i+1]<1)
h=lambda*V:[v for v in zip(*V)if v[1]>0]
def f(v,s):
 l,L=len(v),len(s);m=max(l,L);a,b=(L-l)/2,(l-L)/2;V,U=zip(*O+O*a+v+O*a+O+O);S,T=zip(*O+O*b+s+O*b+O+O);z=[0]*(m+2);w=z[:];r=range(1,m+1);U=list(U);T=list(T)
 for i in r:w[i]=[0,2,3,2,1,0][V[i]]+(5in V[i-1:i+2:2])*(V[i]<5);z[i]=[0,1,2,2+({1,2}&set(S[i-1:i+2:2])>set()),1,0][S[i]]
 for i in r:U[i]-=g(z,V,i);d=g(w,S,i);T[i]-=d-(d>0)*(5in S[i-1:i+2:2])
 V=h(V,U);S=h(S,T)
 if([],[])<(V,S)!=(v,s):return(f(V,S)if S else'V')if V else'S'

Попробуйте онлайн!


Если я правильно понимаю, этот бит: (5in V[i-1:i+2:2])подразумевает, что смежные скальды могут нанести урон. Вам может понадобиться ...*(V[i]!=5)там. Тест:print f([S,S],[P]) # says V but should be a Draw
нгн

@ngn Спасибо за это :)
TFeld

2

APL (Dyalog Classic) , 128 байт

{t l d b p←(-⌊2÷⍨+/0=⊃⍵)∘⌽¨⍵⋄l+←e+3+/0,0,⍨(0=te←(×≢¨p∩¨h)-⊖d+×≢¨b∩¨h3,/0,t,0⋄⍵≡a←↑¨(⊂↓l>0)/¨¨↓¨t l d b p:00s←+/l>0:×-/s⋄∇a}

Попробуйте онлайн!

В ссылке gTIO есть две функции: это функция игры в гольф, описанная выше, и функция fбез игры в гольф, которая принимает пару строк, преобразует их в подходящее представление и вызывает функцию игры в гольф.

Входные данные tсостоят из пяти матриц: типы воинов в виде целых чисел; lжизнь; dповреждение; bкакие типы воинов дают бонус, когда рядом; pто же самое для защиты. Матрицы состоят из двух рядов - викингов и саксов. Если их воины не совпадают, матрицы должны быть дополнены нулями, но не обязательно центрированы. Результат 1/ ¯1для викингов / саксонской победы или 0для ничьей.

{
  t l d b p←(-⌊2÷⍨+/0=⊃⍵)∘⌽¨⍵  centre the matrices
   (-⌊2÷⍨+/0=⊃⍵) is a pair of numbers - by how much we should rotate (⌽) the rows
         +/0=⊃⍵  how many dead? (⊃⍵ is the types, dead warriors have type 0)
    -⌊2÷⍨        negated floor of half

  l+←e+3+/0,0,⍨(0=t)×e←(×≢¨p∩¨h)-⊖d+×≢¨b∩¨h←3,/0,t,0  compute and apply effective damage
   h3,/0,t,0  are triples of types - self and the two neighbours
   b∩¨h        for each warrior intersect (∩) h with his bonus-giving set b
   ×≢¨         non-empty? 0 or 1
   d+          add to the damage normally inflicted
              reverse vertically (harm the enemy, not self)
   (×≢¨p∩¨h)   same technique for protections (neighbouring priests)
   e          remember as "e" for "effective damage"; we still need to do the diagonal attacks
   (0=t      zero out the attacks on living warriors
   3+/0,0,⍨    sum triples - each warrior suffers the damage intended for his dead neigbours
   e+          add that to the effective damage
   l+←         decrease life ("e" is actually negative)

  ⍵≡a←↑¨(⊂↓l>0)/¨¨↓¨t l d b p:0  remove dead; if no data changed, it's a draw
  ⍝ ↓¨          split each matrix into two row-vectors
  ⍝ (⊂↓l>0)     boolean mask of warrios with any life left, split in two and enclosed
  ⍝ /¨¨         keep only the survivors
  ⍝ ↑¨          mix the pairs of rows into matrices again, implicitly padding with 0-s
  ⍝ a←          call that "a" - our new arguments
  ⍝ ⍵≡a ... :0  is "a" the same as our original arguments? - nothing's changed, it's a draw

  0∊s←+/l>0:×-/s ⍝ if one team has no members left, they lost
  ⍝ l>0         bitmask of survivors
  ⍝ s←+/l>0     how many in each camp
  ⍝ 0∊          has any of the two armies been annihilated?
  ⍝ :×-/s       if yes, which one? return sign of the difference: ¯1 or 1, or maybe 0

  ∇a ⍝ repeat
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.