Ściana tarczy

18

Tło historyczne

Ściana tarczy to taktyczna formacja wojenna, której początki sięgają przynajmniej 2500 lat pne Składał się z wojowników nakładających się na tarcze tarcz swoich towarzyszy, tworząc „ścianę”. Urok taktyki wynika z faktu, że nawet najbardziej niewykwalifikowany wojownik mógł walczyć w ścianie, o ile mieli tarczę i broń. Ze względu na bliskość murów niewiele było miejsca do poruszania się, a bitwa zwykle zamieniała się w walkę z użyciem ostrej broni.

Wyzwanie

Twoim zadaniem jest stworzenie programu lub funkcji, która biorąc pod uwagę dwie tablice / listy / wektory wojowników jako dane wejściowe, decyduje o wyniku bitwy. Listy będą reprezentować jednowierszową ścianę tarcz i będą postępować według określonej notacji:

Wikingowie:

Nordyccy wojownicy mieli zaciętą ochotę do bitwy. Pod koniec VIII do połowy XI wieku duńscy wikingowie zaatakowali królestwa brytyjskie w poszukiwaniu bogactwa i ziemi uprawnej. Na potrzeby tego wyzwania są to wojownicy wikingów:

  • JARL: Zazwyczaj znaleźć prowadząc swoich ludzi od środka ściany, Jarls byli przywódcy hordy Wikingów. Przyjmuje 15 obrażeń, aby umrzeć, i zadaje 2 obrażenia na rundę.
  • BErserker: Chociaż fantazja znacznie skręcone wizerunku Berserkers te wojownicy znani byli walczyć w transie podobnym wściekłości bez jakiejkolwiek ochrony innych niż ich tarcze. Przyjmuje 6 obrażeń, aby umrzeć, i zadaje 3 obrażenia na rundę.
  • The CHieftain: Chieftains byli bogacze, którzy mieli wolnych ludzi w ich usług. Zwykle zdobyli wielką chwałę i bogactwa w bitwie. Przyjmuje 10 obrażeń, aby umrzeć, i zadaje 2 obrażenia na rundę.
  • The Free Men: Warriors, którzy służyli wodzowi. Przysięgali walczyć o swoich panów aż do śmierci. Przyjmuje 8 obrażeń, aby umrzeć, i zadaje 1 obrażenie na rundę.
  • SKald: Skaldowie, zazwyczaj tłumaczone jako bardowie byli wolnymi ludźmi, którzy zostali zatrudnieni pisać wiersze, opowiadania i piosenki o wielkich czynach nordyckich wojowników. Przyjmuje 8 obrażeń, aby umrzeć, i daje każdemu sąsiadującemu wojownikowi 1 dodatkowe obrażenia. Skaldowie nie zadają obrażeń. W ten sposób wojownicy nie mogą otrzymać więcej niż 1 premii do obrażeń.

Saksoni:

Saksoni przybyli do Wielkiej Brytanii z Europy kontynentalnej po upadku Cesarstwa Rzymskiego w V wieku. Na potrzeby tego wyzwania są wojownicy saksonów:

  • EARL: Ealdormen , powszechnie nazywane Earls, należeli do wyższej szlachty. Zwykle zajmowali wielkie połacie ziemi i mieli setki, a nawet tysiące zaprzysiężonych ludzi. Przyjmuje 20 obrażeń, aby umrzeć i zadaje 1 obrażenie na rundę.
  • KNoc: Z braku lepszego określenia, że rycerze byli drobnych szlachciców, którzy posiadali jakąś ziemię. W większości przypadków rycerze byli zaprzysiężonymi sługami hrabiego. Przyjmuje 10 obrażeń, aby umrzeć, i zadaje 2 obrażenia na rundę.
  • W Warrior: Często ludzie, zwykle drobne szlachta bez ziemi i chłopów, którzy służyli rycerza. W sąsiedztwie rycerza lub hrabiego wojownicy mają premię do obrażeń +1. Przyjmuje 8 obrażeń, aby umrzeć i zadaje 2 obrażenia na rundę.
  • FYrd: The Fyrd była milicja, jak grupa ludzi wolnych, zwykle biednych rolników, którzy by przynieść dowolną broń (lub podobną broń hodowla wdrożenia) musieli walczyć w ścianie. Przyjmuje 5 obrażeń, aby umrzeć i zadaje 1 obrażenie na rundę.
  • W Priest: Kapłani zostali wysoko cenione na początku kultury saskiej, będąc zwiastunami słowa Bożego. Kapłani otrzymują 15 obrażeń, aby umrzeć, i zapobiegają nawet 1 obrażeniom, które każdy sąsiadujący wojownik otrzymałby. Kapłani nie zadają obrażeń. Kapłani nie mogą zapobiec wojownikowi o więcej niż 1 obrażenie.

Ściana

Ściany spotykają się w swoich centrach. W każdej rundzie każdy wojownik zadaje obrażenia wojownikowi bezpośrednio przed nim lub, jeśli nie ma żywego wojownika przed nim, żyjącego wojownika po przekątnej z najmniejszą ilością życia. Jeśli jest remis, wybierz wojownika bliżej krawędzi ściany.

Przykład:

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.

Zasady:

  • Obowiązują domyślne luki .
  • Możesz użyć dowolnej dogodnej metody We / Wy .
  • To jest , więc wygrywa najkrótszy kod (w bajtach, na język).
  • Nie możesz zakładać, że listy będą miały tę samą długość, ale zawsze będą można je wyrównać w ich środkach (zawsze będzie nieparzysta liczba wojowników na każdej liście, jeśli listy mają różne rozmiary).
  • Możesz wygenerować dowolną wartość true / falsey. Proszę podać w swojej odpowiedzi odpowiedniki „zwycięstwa Wikingów / Saksonii”.
  • Przegrany jest określany, kiedy wszyscy wojownicy muru nie żyją.
  • Jeśli kiedykolwiek skończysz ze ścianami, których nie można wyrównać podczas wykonywania kodu, wyrównaj je tak centralnie, jak to możliwe, pozostawiając jednego dodatkowego wojownika na dłuższej ścianie po prawej stronie. Na przykład:

      [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]
    
  • Spróbuj przetestować swój kod za pomocą dowolnej konfiguracji ścian, nie tylko tych w przypadkach testowych.

Przypadki testowe:

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

Istnieją pewne nieścisłości historyczne. Wskaż je, a ja postaram się je naprawić.

J. Sallé
źródło
Czy możemy zdefiniować inne symbole zamiast pierwszych liter nazw, na przykład cyfry 0–9?
NieDzejkob
@NieDzejkob pewna rzecz. Po prostu upewnij się, że określiłeś w odpowiedzi, które symbole zostały użyte dla którego wojownika.
J. Sallé
3
Czy rozważanie oszukiwania byłoby traktowane jako właściwość zamiast liter? (przykład jako (health, damage, damagebonus, protbonus))
HyperNeutrino,
@HyperNeutrino Nie jestem do końca pewien, ale myślę, że byłoby dobrze? Nie rozumiem, jak to może dać ci dużą przewagę. Jak powiedziałem NieDzejkobowi, dopóty, dopóki w odpowiedzi określisz, co reprezentuje każdego wojownika, idź.
J. Sallé

Odpowiedzi:

3

Python 2 , 576 573 565 554 540 549 bajtów

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'

Wypróbuj online!

TFeld
źródło
Jeśli dobrze rozumiem, ten bit: (5in V[i-1:i+2:2])sugeruje, że sąsiednie skalds mogą zadawać obrażenia. Możesz ...*(V[i]!=5)tam potrzebować . Test:print f([S,S],[P]) # says V but should be a Draw
2017
@ngn Dzięki za to :)
TFeld
2

APL (Dyalog Classic) , 128 bajtów

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

Wypróbuj online!

Łącze TIO ma dwie funkcje: gjest grą w golfa powyżej if to gra jest to gra w golfa, która akceptuje parę łańcuchów, przekształca je w odpowiednią reprezentację i wywołuje funkcję golfa.

Dane wejściowe to pięć macierzy: ttypy wojowników jako ints; lżycie; duszkodzić; bjakie typy wojowników dają bonus, gdy sąsiadują; pto samo dotyczy ochrony. Matryce składają się z dwóch rzędów - Wikingowie i Saksoni. Jeśli ich wojownicy nie mają tej samej liczby, macierze muszą być wypełnione zerami, choć niekoniecznie wyśrodkowane. Rezultatem jest 1/ ¯1zwycięstwo Wikingów / Saksonii lub 0remis.

{
  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
}
ngn
źródło