역사적 배경
방패 벽은 전술 전쟁 형성으로 , 적어도 거슬러 올라갑니다. 2500 BC. 그것은 방패를 동료의 방패와 겹쳐서 ‘벽’을 형성하는 전사들로 구성되었습니다. 전술의 매력은 실력이 가장없는 전사조차도 방패와 무기가 있으면 벽에서 싸울 수 있다는 사실에서 비롯됩니다. 벽이 가까워서 움직일 공간이 거의 없었으며, 전투는 보통 날카로운 무기로 싸웠습니다.
도전
당신의 임무는 입력으로 두 전사의 배열 / 목록 / 벡터가 주어지면 전투의 결과를 결정하는 프로그램이나 기능을 만드는 것입니다. 이 목록은 한 줄짜리 방패 벽을 나타내며 특정 표기법을 따릅니다.
바이킹 :
북유럽 전사들은 치열한 전투를 벌였습니다. 8 세기 말에서 11 세기 중반까지 덴마크 바이킹은 영국 왕국을 침공하여 부와 농경지를 찾았습니다. 이 도전의 목적을 위해 이들은 바이킹 전사입니다.
J
ARL : 보통 벽의 중심에서 자신의 남자를 선도하는 발견은, jarls는 바이킹 무리의 지도자였다. 사망시 15의 데미지를 입히고 라운드 당 2의 피해를줍니다.B
erserker는 : 환상이 크게 버서커의 이미지를 비틀어 있지만, 이러한 전사는 방패가 아닌 보호의 어떤 종류없이 무아 지경 같은 분노에 싸움을하는 것으로 알려져 있었다. 6의 데미지를 입히고 라운드 당 3의 피해를줍니다.- 그만큼
C
hieftain : 족장이 자신의 서비스에서 무료로 남성이 있었다 부자했다. 그들은 대개 전투에서 큰 영광과 부를 얻었습니다. 죽는 데 10의 피해를 입히고 라운드 당 2의 피해를줍니다. - 무료
M
en : 족장을 섬기는 전사들. 그들은 죽을 때까지 영주를 위해 싸울 것을 맹세했습니다. 죽는 데 8의 피해를 입히고 한 라운드에 1의 피해를줍니다. S
kald : Skalds, 보통 음유 시인으로 번역은 북유럽 전사의 위대한 업적에 대한시, 이야기 나 노래를 작성하는 고용 된 자유인이었다. 8의 데미지를 입히고, 인접한 각 전사에게 1의 추가 피해를줍니다. 해골 은 피해를 입지 않습니다 . 전사 는 이런 식으로 추가 피해를 2 회 이상받을 수 없습니다 .
색슨 족 :
색슨 족은 5 세기 로마 제국의 멸망에 이어 유럽 대륙에서 영국에 정착하게되었습니다. 이 도전의 목적을 위해 색슨 족의 전사가 있습니다.
E
ARL : Ealdormen , 일반적으로 얼스라는이 높은 귀족의 일원이었다. 그들은 대개 큰 땅을 가졌으며 수백 또는 수천 명의 맹세 한 남자가있었습니다. 20의 데미지를 입히고 라운드 당 1의 피해를줍니다.K
밤 : 더 나은 용어의 부족의 경우, 기사는 약간의 땅을 소유 작은 귀족이었다. 대부분의 경우 기사들은 얼에게 종을 맹세했습니다. 죽는 데 10의 피해를 입히고 라운드 당 2의 피해를줍니다.W
arrior : 일반적인 남성, 토지 또는 기사를 제공 농민없이 일반적으로 작은 귀족. 기사 또는 백작에 인접한 전사는 +1의 피해 보너스를받습니다. 죽는 데 8의 피해를 입히고 라운드 당 2의 피해를줍니다.F
YRD 다음 Fyrd이었다 민병대와 같은 어떤 무기 (또는 구현 농업 무기 등)가 벽에 싸워야했다을 가져다 줄 자유인, 일반적으로 가난한 농부의 그룹. 죽는 데 5의 피해를 입히고 라운드 당 1의 피해를줍니다.P
riest : 사제는 높은 하나님의 말씀의 전령 인, 초기 색슨 문화에서 평가되었다. 사제는 15의 피해를 입히고, 인접한 각 전사가받는 최대 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.
규칙 :
- 기본 허점이 적용됩니다.
- 편리한 IO 방법을 사용할 수 있습니다 .
- 이것은 code-golf 이므로 가장 짧은 코드 (바이트 단위)가 이깁니다.
- 당신 은 목록의 길이가 같을 것이라고 생각 하지 않을 수도 있지만, 중앙에서 항상 정렬 할 수 있습니다 (목록의 크기가 다른 경우 각 목록에 항상 홀수의 전사가있을 것입니다).
- 진실 / 거짓 값을 출력 할 수 있습니다. 답 에 “Viking / Saxon victory”와 동등한 것을 지정하십시오 .
- 패자는 벽의 모든 전사가 죽었을 때 결정됩니다.
-
코드 실행 중에 정렬 할 수없는 벽으로 끝나는 경우 가능한 한 중앙에 정렬하여 더 긴 벽에있는 한 명의 전사를 오른쪽으로 남겨 둡니다. 예 :
[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.)
------------------------------
역사적으로 부정확 한 부분이 있습니다. 그들을 지적하고 난 그들을 해결하기 위해 최선을 다하겠습니다.
답변
파이썬 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'
답변
APL (Dyalog Classic) , 128 바이트
{t l d b p←(-⌊2÷⍨+/0=⊃⍵)∘⌽¨⍵⋄l+←e+3+/0,0,⍨(0=t)×e←(×≢¨p∩¨h)-⊖d+×≢¨b∩¨h←3,/0,t,0⋄⍵≡a←↑¨(⊂↓l>0)/¨¨↓¨t l d b p:0⋄0∊s←+/l>0:×-/s⋄∇a}
TIO 링크에는 두 가지 기능이 있습니다. g
위 f
의 골프 함수이며 한 쌍의 문자열을 받아 적절한 표현으로 변환하고 골프 함수를 호출하는 ungolfed 함수입니다.
입력 값은 5 개의 행렬입니다. t
전사 유형은 정수입니다.l
생명; d
피해를 주다; b
인접 할 때 전사 유형이 보너스를주는 것; p
보호와 동일합니다. 행렬은 Vikings와 Saxons의 두 행으로 구성됩니다. 전사가 같은 숫자가 아닌 경우 반드시 중앙에 위치 할 필요는 없지만 행렬은 0으로 채워 져야합니다. 결과는 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
⍝ h←3,/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
}