กำแพงโล่


18

ประวัติความเป็นมา

กำแพงโล่เป็นรูปแบบสงครามทางยุทธวิธีที่ย้อนกลับไปอย่างน้อย 2500 ปีก่อนคริสตกาล มันประกอบไปด้วยนักรบที่ซ้อนทับโล่กับเพื่อน ๆ ของพวกเขาเพื่อสร้าง 'กำแพง' ความดึงดูดของชั้นเชิงนั้นมาจากความจริงที่ว่าแม้แต่นักรบไร้ฝีมือที่สุดก็สามารถต่อสู้ในกำแพงตราบเท่าที่พวกเขามีเกราะและอาวุธ เนื่องจากอยู่ใกล้กับกำแพงจึงมีพื้นที่เล็ก ๆ น้อย ๆ ให้ย้ายไปรอบ ๆ และการต่อสู้มักจะกลายเป็นการแข่งขันที่ต่อสู้กับอาวุธมีคม

ความท้าทาย

งานของคุณคือการสร้างโปรแกรมหรือฟังก์ชั่นที่กำหนดให้สองอาร์เรย์ / รายการ / เวกเตอร์ของนักรบเป็นตัวตัดสินผลลัพธ์ของการต่อสู้ รายการจะเป็นตัวแทนของกำแพงบรรทัดเดียวและพวกเขาจะทำตามสัญกรณ์เฉพาะ

ไวกิ้ง:

นักรบนอร์ดิกมีแรงขับที่ดุเดือดในการต่อสู้ ในช่วงปลายศตวรรษที่ 8 จนถึงกลางศตวรรษที่ 11 ชาวไวกิ้งชาวเดนมาร์กได้บุกเข้ายึดอาณาจักรของสหราชอาณาจักรเพื่อค้นหาความร่ำรวยและพื้นที่เพาะปลูก สำหรับจุดประสงค์ของการท้าทายเหล่านี้คือนักรบของไวกิ้ง:

  • อาร์ลJ: มักพบว่านำคนของเขาออกมาจากกลางกำแพง Jarls เป็นผู้นำของกลุ่มไวกิ้ง รับ 15 ดาเมจในการตายและสร้างความเสียหายได้ 2 ดาเมจต่อรอบ
  • ผู้Bจู่โจม: ถึงแม้ว่าจินตนาการจะทำให้ภาพลักษณ์ของผู้บ้าบิ่นบิดเบี้ยวอย่างมากนักรบเหล่านี้ก็รู้ดีว่าการต่อสู้ในสภาพที่ดุเดือดเหมือนมึนงงไม่มีการป้องกันใด ๆ นอกเหนือจากโล่ รับ 6 ดาเมจในการตายและสร้างความเสียหาย 3 ดาเมจต่อรอบ
  • Chieftain: เป็นต้นเป็นผู้ชายที่อุดมไปด้วยคนที่มีฟรีบริการของพวกเขา พวกเขามักจะได้รับชื่อเสียงที่ยิ่งใหญ่และความร่ำรวยในการต่อสู้ รับ 10 ดาเมจในการตายและสร้างความเสียหาย 2 ดาเมจต่อรอบ
  • The Men: Warriors ที่รับใช้หัวหน้าเผ่า พวกเขาสาบานว่าจะต่อสู้เพื่อขุนนางจนตาย รับ 8 ดาเมจในการตายและทำ 1 ดาเมจต่อรอบ
  • The Skald: Skalds ซึ่งมักจะแปลว่าเลื่องชื่อเป็นชายอิสระที่ถูกจ้างให้เขียนบทกวีเรื่องราวหรือเพลงเกี่ยวกับการกระทำอันยิ่งใหญ่ของนักรบนอร์ดิก รับ 8 ดาเมจในการตายและมอบความเสียหายโบนัส 1 Warrior ติดกัน Skalds ไม่สร้างความเสียหาย Warriors ไม่สามารถได้รับโบนัสมากกว่า 1 ดาเมจในทางนี้

แอกซอน:

ชาวแซ็กซอนมาตั้งถิ่นฐานในสหราชอาณาจักรจากทวีปยุโรปหลังจากการล่มสลายของจักรวรรดิโรมันในศตวรรษที่ 5 สำหรับจุดประสงค์ของการท้าทายนี้มีนักรบของแซกซอน:

  • EARL: ealdormenธรรมดาเรียกว่าเอิร์ลเป็นสมาชิกของสังคมชั้นสูงที่สูงขึ้น พวกเขามักจะถือครองที่ดินที่ดีและมีคนสาบสูญนับร้อยหรือหลายพันคน รับ 20 ดาเมจในการตายและทำ 1 ดาเมจต่อรอบ
  • Kคืน: สำหรับขาดระยะดีกว่าอัศวินเป็นขุนนางเล็ก ๆ น้อย ๆ ที่เป็นเจ้าของที่ดิน ในกรณีส่วนใหญ่อัศวินเป็นคนรับใช้สาบานต่อ Earl รับ 10 ดาเมจในการตายและสร้างความเสียหาย 2 ดาเมจต่อรอบ
  • ที่Warrior: คนธรรมดามักรองขุนนางโดยไม่มีที่ดินหรือชาวนาที่ทำหน้าที่เป็นอัศวิน เมื่ออยู่ติดกับอัศวินหรือเอิร์ลนักรบจะได้รับโบนัสดาเมจ +1 รับ 8 ดาเมจและสร้างความเสียหายได้ 2 ดาเมจต่อรอบ
  • FYRD: ผู้ 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.

กฎ:

  • มีการใช้ช่องโหว่เริ่มต้น
  • คุณสามารถใช้วิธีการใด ๆ IO สะดวก
  • นี่คือดังนั้นจึงเป็นรหัสที่สั้นที่สุด (เป็นไบต์ต่อภาษา)
  • คุณอาจไม่คิดว่ารายการจะมีความยาวเท่ากัน แต่จะสามารถจัดตำแหน่งที่กึ่งกลางได้เสมอ (จะมีนักรบจำนวนคี่ในแต่ละรายการเสมอหากรายการมีขนาดแตกต่างกัน)
  • คุณสามารถส่งออกค่าจริง / เท็จใด ๆ โปรดระบุคำตอบของคุณในสิ่งที่เทียบเท่ากับ "ชัยชนะของไวกิ้ง / แซกซอน"
  • ผู้แพ้จะถูกกำหนดเมื่อนักรบทั้งหมดของกำแพงตาย
  • หากคุณจบลงด้วยกำแพงที่ไม่สามารถปรับได้ในระหว่างการประมวลผลโค้ดให้จัดแนวเหล่านั้นให้อยู่ตรงกลางที่สุดเท่าที่จะทำได้โดยทิ้งนักรบพิเศษหนึ่งตัวไว้บนกำแพงที่ยาวขึ้นไปทางด้านขวา เช่น:

      [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])แสดงว่า skalds ที่อยู่ติดกันสามารถสร้างความเสียหายได้ คุณอาจต้อง...*(V[i]!=5)มี การทดสอบ:print f([S,S],[P]) # says V but should be a Draw
NGN

ขอบคุณสำหรับ @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}

ลองออนไลน์!

มีฟังก์ชั่นสองอย่างในลิงค์ TIO: gคือฟังก์ชั่น golfed ด้านบนและf golfedเป็นฟังก์ชั่น ungolfed ที่รับสายคู่หนึ่งแปลงเป็นตัวแทนที่เหมาะสมและเรียกฟังก์ชั่น golfed

อินพุตคือเมทริกซ์ห้าตัว: tประเภทนักรบเป็น ints; lชีวิต; dสร้างความเสียหาย; bนักรบประเภทใดให้โบนัสเมื่ออยู่ติดกัน pเหมือนกันสำหรับการป้องกัน เมทริกซ์ประกอบด้วยสองแถว - ไวกิ้งและแซกซอน หากนักรบของพวกเขาไม่ได้หมายเลขเดียวกันเมทริกซ์จะต้องเป็น 0-padded แต่ไม่จำเป็นต้องอยู่กึ่งกลาง ผลที่ได้คือ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
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.