태그 보관물: decision-problem

decision-problem

방패 벽 W F F F Round 1:

역사적 배경

방패 벽은 전술 전쟁 형성으로 , 적어도 거슬러 올라갑니다. 2500 BC. 그것은 방패를 동료의 방패와 겹쳐서 ‘벽’을 형성하는 전사들로 구성되었습니다. 전술의 매력은 실력이 가장없는 전사조차도 방패와 무기가 있으면 벽에서 싸울 수 있다는 사실에서 비롯됩니다. 벽이 가까워서 움직일 공간이 거의 없었으며, 전투는 보통 날카로운 무기로 싸웠습니다.

도전

당신의 임무는 입력으로 두 전사의 배열 / 목록 / 벡터가 주어지면 전투의 결과를 결정하는 프로그램이나 기능을 만드는 것입니다. 이 목록은 한 줄짜리 방패 벽을 나타내며 특정 표기법을 따릅니다.

바이킹 :

북유럽 전사들은 치열한 전투를 벌였습니다. 8 세기 말에서 11 세기 중반까지 덴마크 바이킹은 영국 왕국을 침공하여 부와 농경지를 찾았습니다. 이 도전의 목적을 위해 이들은 바이킹 전사입니다.

  • JARL : 보통 벽의 중심에서 자신의 남자를 선도하는 발견은, jarls는 바이킹 무리의 지도자였다. 사망시 15의 데미지를 입히고 라운드 당 2의 피해를줍니다.
  • Berserker는 : 환상이 크게 버서커의 이미지를 비틀어 있지만, 이러한 전사는 방패가 아닌 보호의 어떤 종류없이 무아 지경 같은 분노에 싸움을하는 것으로 알려져 있었다. 6의 데미지를 입히고 라운드 당 3의 피해를줍니다.
  • 그만큼 Chieftain : 족장이 자신의 서비스에서 무료로 남성이 있었다 부자했다. 그들은 대개 전투에서 큰 영광과 부를 얻었습니다. 죽는 데 10의 피해를 입히고 라운드 당 2의 피해를줍니다.
  • 무료 Men : 족장을 섬기는 전사들. 그들은 죽을 때까지 영주를 위해 싸울 것을 맹세했습니다. 죽는 데 8의 피해를 입히고 한 라운드에 1의 피해를줍니다.
  • Skald : Skalds, 보통 음유 시인으로 번역은 북유럽 전사의 위대한 업적에 대한시, 이야기 나 노래를 작성하는 고용 된 자유인이었다. 8의 데미지를 입히고, 인접한 각 전사에게 1의 추가 피해를줍니다. 해골 피해를 입지 않습니다 . 전사 이런 식으로 추가 피해를 2 회 이상받을 수 없습니다 .

색슨 족 :

색슨 족은 5 세기 로마 제국의 멸망에 이어 유럽 대륙에서 영국에 정착하게되었습니다. 이 도전의 목적을 위해 색슨 족의 전사가 있습니다.

  • EARL : Ealdormen , 일반적으로 얼스라는이 높은 귀족의 일원이었다. 그들은 대개 큰 땅을 가졌으며 수백 또는 수천 명의 맹세 한 남자가있었습니다. 20의 데미지를 입히고 라운드 당 1의 피해를줍니다.
  • K밤 : 더 나은 용어의 부족의 경우, 기사는 약간의 땅을 소유 작은 귀족이었다. 대부분의 경우 기사들은 얼에게 종을 맹세했습니다. 죽는 데 10의 피해를 입히고 라운드 당 2의 피해를줍니다.
  • Warrior : 일반적인 남성, 토지 또는 기사를 제공 농민없이 일반적으로 작은 귀족. 기사 또는 백작에 인접한 전사는 +1의 피해 보너스를받습니다. 죽는 데 8의 피해를 입히고 라운드 당 2의 피해를줍니다.
  • FYRD 다음 Fyrd이었다 민병대와 같은 어떤 무기 (또는 구현 농업 무기 등)가 벽에 싸워야했다을 가져다 줄 자유인, 일반적으로 가난한 농부의 그룹. 죽는 데 5의 피해를 입히고 라운드 당 1의 피해를줍니다.
  • Priest : 사제는 높은 하나님의 말씀의 전령 인, 초기 색슨 문화에서 평가되었다. 사제는 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 방법을 사용할 수 있습니다 .
  • 이것은 이므로 가장 짧은 코드 (바이트 단위)가 이깁니다.
  • 당신 목록의 길이가 같을 것이라고 생각 하지 않을 수도 있지만, 중앙에서 항상 정렬 할 수 있습니다 (목록의 크기가 다른 경우 각 목록에 항상 홀수의 전사가있을 것입니다).
  • 진실 / 거짓 값을 출력 할 수 있습니다. 에 “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=te←(×≢¨p∩¨h)-⊖d+×≢¨b∩¨h3,/0,t,0⋄⍵≡a←↑¨(⊂↓l>0)/¨¨↓¨t l d b p:00s←+/l>0:×-/s⋄∇a}

온라인으로 사용해보십시오!

TIO 링크에는 두 가지 기능이 있습니다. gf의 골프 함수이며 한 쌍의 문자열을 받아 적절한 표현으로 변환하고 골프 함수를 호출하는 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
   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
}


답변