Bức tường khiên


18

Bối cảnh lịch sử

Bức tường khiên là một đội hình chiến tranh có từ ít nhất 2500 trước Công nguyên. Nó bao gồm các chiến binh chồng lên khiên của họ với những người bạn đồng hành của họ để tạo thành một 'bức tường'. Sức hấp dẫn của chiến thuật này đến từ việc ngay cả một chiến binh không có kỹ năng nhất cũng có thể chiến đấu trong một bức tường miễn là họ có khiên và vũ khí. Bởi vì sự gần gũi của các bức tường, có rất ít không gian để di chuyển, và trận chiến thường trở thành một trận đấu xô đẩy được chiến đấu với vũ khí sắc bén.

Các thách thức

Nhiệm vụ của bạn là tạo ra một chương trình hoặc chức năng, đưa ra hai mảng / danh sách / vectơ của các chiến binh làm đầu vào, quyết định kết quả của trận chiến. Các danh sách sẽ đại diện cho một bức tường khiên đơn, và chúng sẽ tuân theo một ký hiệu cụ thể:

Người Viking:

Các chiến binh Bắc Âu đã có một nỗ lực quyết liệt cho trận chiến. Trong khoảng thời gian từ cuối thế kỷ thứ 8 đến giữa thế kỷ 11, những người Viking ở Đan Mạch đã xâm chiếm vương quốc Anh để tìm kiếm sự giàu có và đất nông nghiệp. Với mục đích của thử thách này, đây là những chiến binh của các vikings:

  • Các Jarl: Thường được tìm thấy dẫn dắt người đàn ông của mình từ trung tâm của bức tường, bình là người lãnh đạo của các nhóm viking. Gây 15 sát thương để chết và gây 2 sát thương mỗi vòng.
  • The Berserker: Mặc dù tưởng tượng đã làm thay đổi đáng kể hình ảnh của những kẻ điên cuồng, những chiến binh này được biết là chiến đấu trong một cơn giận dữ giống như trance mà không có bất kỳ loại bảo vệ nào ngoài khiên chắn. Gây 6 sát thương để chết và gây 3 sát thương mỗi vòng.
  • The Chieftain: Chieftains là những người đàn ông giàu có những người đàn ông tự do phục vụ. Họ thường kiếm được vinh quang lớn và giàu có trong trận chiến. Gây 10 sát thương để chết và gây 2 sát thương mỗi vòng.
  • The Free Men: Các chiến binh phục vụ một thủ lĩnh. Họ đã tuyên thệ chiến đấu cho lãnh chúa của họ cho đến khi chết. Gây 8 sát thương để chết và gây sát thương 1 điểm mỗi vòng.
  • The Skald: Skalds, thường được dịch là bards, là những người tự do được thuê để viết những bài thơ, câu chuyện hoặc bài hát về những việc làm vĩ đại của các chiến binh Bắc Âu. Gây 8 sát thương để chết và cho mỗi chiến binh sát thương thêm 1 điểm sát thương. Skalds không gây sát thương. Chiến binh không thể nhận được nhiều hơn 1 điểm sát thương theo cách này.

Đàn kèn

Người Saxon đến định cư ở Anh từ lục địa châu Âu sau sự sụp đổ của Đế chế La Mã vào thế kỷ thứ 5. Với mục đích của thử thách này, có những chiến binh của saxophone:

  • Các Earl: Ealdormen , thường được gọi là Earls, là thành viên của giới quý tộc cao hơn. Họ thường nắm giữ những dải đất lớn và có hàng trăm thậm chí hàng ngàn người đàn ông đã tuyên thệ. Gây 20 sát thương để chết và gây sát thương 1 điểm mỗi vòng.
  • Các Kđêm: Đối với thiếu một thuật ngữ tốt hơn, các hiệp sĩ đã quý tộc nhỏ người sở hữu một số đất đai. Trong hầu hết các trường hợp, các hiệp sĩ là những người hầu tuyên thệ cho một Bá tước. Gây 10 sát thương để chết và gây 2 sát thương mỗi vòng.
  • Người Wchiến binh: Những người đàn ông bình thường, thường là những quý tộc nhỏ không có đất hoặc nông dân phục vụ một hiệp sĩ. Khi liền kề với một Hiệp sĩ hoặc Bá tước, các chiến binh có phần thưởng sát thương +1. Gây 8 sát thương để chết và gây 2 sát thương mỗi vòng.
  • The Fyrd: Fyrd là một nhóm người tự do giống như dân quân, thường là nông dân nghèo, họ sẽ mang theo bất kỳ vũ khí nào (hoặc nông cụ giống như vũ khí) mà họ phải chiến đấu trên tường. Gây 5 sát thương để chết và gây sát thương 1 điểm mỗi vòng.
  • Điều Ptuyệt vời nhất: Các linh mục được đánh giá cao trong văn hóa Saxon thời kỳ đầu, được báo trước những lời của Thiên Chúa. Các linh mục nhận 15 sát thương để chết và ngăn chặn tối đa 1 sát thương mỗi chiến binh liền kề sẽ bị xử lý. Linh mục không gây sát thương. Các linh mục không thể ngăn chặn hơn 1 thiệt hại cho một chiến binh.

Bức tường

Tường gặp nhau tại trung tâm của họ. Mỗi vòng, mỗi chiến binh sẽ gây sát thương cho chiến binh ngay trước mặt hoặc, nếu không có chiến binh sống trước mặt, chiến binh sống theo đường chéo có ít máu nhất. Nếu có cà vạt, hãy chọn chiến binh ở sát mép tường.

Thí dụ:

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.

Quy tắc:

  • Lỗ hổng mặc định áp dụng.
  • Bạn có thể sử dụng bất kỳ phương pháp IO thuận tiện .
  • Đây là , vì vậy mã ngắn nhất (tính bằng byte, trên mỗi ngôn ngữ) sẽ thắng.
  • Bạn có thể không cho rằng các danh sách sẽ có cùng độ dài, nhưng chúng sẽ luôn được xếp thẳng hàng tại trung tâm của chúng (sẽ luôn có một số lượng chiến binh lẻ trong mỗi danh sách nếu danh sách có kích cỡ khác nhau).
  • Bạn có thể xuất bất kỳ giá trị trung thực / falsey. Vui lòng ghi rõ trong câu trả lời của bạn tương đương với "chiến thắng Viking / Saxon".
  • Người thua cuộc được xác định khi tất cả các chiến binh của một bức tường đã chết.
  • Nếu bạn kết thúc với những bức tường không thể căn chỉnh trong quá trình thực thi mã, hãy căn chỉnh chúng càng tập trung càng tốt, để lại một chiến binh phụ trên bức tường dài hơn ở phía bên phải. Ví dụ:

      [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]
    
  • Hãy thử và kiểm tra mã của bạn với bất kỳ thiết lập tường nào, không chỉ các mã trong các trường hợp thử nghiệm.

Các trường hợp thử nghiệm:

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

Có một số điểm không chính xác trong lịch sử. Vui lòng chỉ ra chúng và tôi sẽ cố gắng hết sức để khắc phục chúng.



Chúng ta có thể định nghĩa các ký hiệu khác thay vì các chữ cái đầu tiên của tên, ví dụ số 0-9 không?
NieDzejkob

@NieDzejkob chắc chắn điều. Chỉ cần chắc chắn rằng bạn xác định trong câu trả lời của bạn những biểu tượng đã được sử dụng cho chiến binh nào.
J. Sallé

3
Nó sẽ được coi là gian lận để lấy đầu vào là tài sản của họ chứ không phải là chữ cái? (ví dụ như (health, damage, damagebonus, protbonus))
HyperNeutrino

@HyperNeutrino Tôi không chắc lắm, nhưng tôi nghĩ nó sẽ ổn chứ? Tôi không thấy làm thế nào có thể cung cấp cho bạn một lợi thế lớn. Như tôi đã nói với NieDzejkob, miễn là bạn chỉ định trong câu trả lời của mình những gì đại diện cho mỗi chiến binh, hãy làm điều đó.
J. Sallé

Câu trả lời:


3

Python 2 , 576 573 565 554 540 549 byte

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'

Hãy thử trực tuyến!


Nếu tôi hiểu chính xác, bit này: (5in V[i-1:i+2:2])ngụ ý rằng skalds liền kề có thể gây ra thiệt hại. Bạn có thể cần một ...*(V[i]!=5)ở đó. Kiểm tra:print f([S,S],[P]) # says V but should be a Draw
ngn

@ngn Cảm ơn vì điều đó :)
TFeld

2

APL (Dyalog Classic) , 128 byte

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

Hãy thử trực tuyến!

Có hai chức năng trong liên kết TIO: glà chức năng đánh gôn ở trên và flà chức năng không được chấp nhận chấp nhận một cặp dây, chuyển đổi chúng thành một đại diện phù hợp và gọi chức năng đánh gôn.

Đầu vào là năm ma trận: tcác loại chiến binh như ints; lđời sống; dhư hại; bNhững loại chiến binh cho tiền thưởng khi liền kề; ptương tự để bảo vệ. Các ma trận bao gồm hai hàng - Vikings và Saxons. Nếu các chiến binh của họ không cùng số, ma trận phải là 0 đệm, mặc dù không nhất thiết phải là trung tâm. Kết quả là 1/ ¯1cho chiến thắng Viking / Saxon hoặc 0cho một trận hòa.

{
  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
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.