Kalkan Duvarı


18

Tarihsel arka plan

Kalkan duvarı, M.Ö. en az 2500 yılına kadar uzanan taktik bir savaş oluşumudur . Bir `` duvar '' oluşturmak için kalkanlarının yoldaşlarıyla örtüşen savaşçılardan oluşuyordu. Taktiğin çekiciliği, en vasıfsız savaşçıların bile bir kalkan ve silahları olduğu sürece bir duvarda savaşabilmelerinden kaynaklanmaktadır. Duvarların yakınlığı nedeniyle hareket etmek için çok az yer vardı ve savaş genellikle keskin silahlarla savaşan şoke bir maç haline geldi.

Meydan okuma

Göreviniz, savaşçıların iki dizisi / listesi / vektörü girdi olarak verildiğinde, savaşın sonucuna karar veren bir program veya işlev oluşturmaktır. Listeler tek satırlık bir kalkan duvarını temsil edecek ve belirli bir gösterimi takip edecekler:

Vikingler:

İskandinav savaşçıların savaşmak için sert bir dürtüsü vardı. 8. yüzyılın sonundan 11. yüzyılın ortalarına kadar, Danimarkalı Vikingler İngiltere krallıklarını istila ve tarım arazileri aramak için işgal etti. Bu mücadelenin amacı için, bunlar Vikinglerin savaşçılarıdır:

  • JArl: Genellikle duvarın merkezine adamlarını lider buldum, Jarls viking ordularını liderleri idi. Ölmek için 15 hasar alır ve her turda 2 hasar verir.
  • BErserker: fantezi büyük ölçüde Berserkers imajını bükülmüş olsa da, bu savaşçılar kalkanlarının dışındaki koruma her türlü olmadan bir trans benzeri öfke savaşmak için biliniyordu. Ölmek üzere 6 hasar alır ve her turda 3 hasar verir.
  • CHieftain: Chieftains onların hizmetinde özgür insanlar vardı zengin adamlardı. Savaşta genellikle büyük zafer ve zenginlik kazanırlardı. Ölmek için 10 hasar alır ve her turda 2 hasar verir.
  • Özgür Mtr: Bir şefe hizmet eden savaşçılar. Ölümüne kadar efendileri için savaşmaya yemin ettiler. Ölmek üzere 8 hasar alır ve her turda 1 hasar verir.
  • SKald: Skalds, genellikle ozanlar olarak tercüme İskandinav savaşçı büyük işlerin hakkında şiirler, öyküler veya şarkı yazmak için işe alındı ücretsiz adamlardı. Ölmek için 8 hasar alır ve her komşu savaşçıya 1 ilave hasar verir. Skalds hiçbir zarar vermez . Warriors olamaz 1'den fazla bonus hasar bu şekilde kazanırlar.

Saksonlar:

Saksonlar, 5. yüzyılda Roma İmparatorluğu'nun ölümünün ardından kıta Avrupa'sından İngiltere'ye yerleşmeye başladılar. Bu mücadelenin amaçları için saksonların savaşçıları var:

  • EArl: Ealdormen yaygın Earls denilen yüksek asalet üyeleriydi. Genellikle büyük topraklar tutuyorlardı ve yüzlerce hatta binlerce yeminli erkekleri vardı. Ölmek için 20 hasar alır ve her turda 1 hasar verir.
  • KGece: Daha iyi bir terim olmadığı için, şövalyeler bazı arazinin sahibi küçük soylular vardı. Çoğu durumda şövalyeler bir Earl'e hizmetkar yemin etti. Ölmek için 10 hasar alır ve her turda 2 hasar verir.
  • WArrior: Yaygın erkek, kara veya bir şövalye servis köylüler olmadan genellikle minör soylular. Bir Şövalye veya Earl'e bitişik olduğunda, savaşçıların +1 hasar bonusu vardır. Ölmek üzere 8 hasar alır ve her turda 2 hasar verir.
  • FYrd: Fyrd bir milis benzeri herhangi bir silah (veya uygulamak tarım silah benzeri) onlar duvarda savaşmak zorunda getirecek özgür insanlar, genellikle yoksul çiftçiler, grup. Ölmek için 5 hasar alır ve her turda 1 hasar verir.
  • PRiest: Rahipler yüksek Tanrı'nın kelimelerin müjdesini olmanın erken Sakson kültüründe değerli edildi. Rahipler ölmek için 15 hasar alırlar ve her komşu savaşçının dağıtılabileceği 1 hasarı önlerler. Rahipler zarar vermez . Rahipler edemez bir savaşçıya 1'den fazla zarar görmesini önlemek.

Duvar

Duvarlar merkezlerinde buluşuyor. Her turda, her savaşçı doğrudan önündeki savaşçıya hasar verir veya önünde yaşayan bir savaşçı yoksa, en az sağlığa sahip çapraz olarak bitişik yaşayan savaşçı. Bir kravat varsa, duvarın kenarına daha yakın olan savaşçıyı seçin.

Misal:

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.

Kurallar:

  • Varsayılan Loopholes uygulanır.
  • Herhangi bir uygun IO yöntemini kullanabilirsiniz .
  • Bu , bu yüzden en kısa kod (bayt, dil başına) kazanır.
  • Sen olmayabilir listeleri aynı uzunluğa sahip olacak varsayalım, ama onlar olacak hep (listeler farklı boyutlarda ise her zaman, her listedeki savaşçı bir tek sayı olacak) kendi merkezlerinde bir şekilde sıralanır olacak.
  • Herhangi bir doğruluk / falsey değeri çıktısı verebilirsiniz. Lütfen cevabınızda "Viking / Sakson zaferi" nin eşdeğerlerini belirtin .
  • Bir duvarın tüm savaşçıları öldüğünde kaybeden belirlenir.
  • Kod yürütme sırasında hizalanamayan duvarlarla sonuçlanırsanız, bunları mümkün olduğunca merkezi olarak hizalayın ve uzun duvarda bir ekstra savaşçı sağ tarafa bırakın. Örneğin:

      [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]
    
  • Kodunuzu yalnızca test durumlarındakilerle değil, herhangi bir duvar kurulumuyla denemekten ve test etmekten çekinmeyin.

Test Durumları:

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

Bazı tarihsel yanlışlıklar var. Onları belirtmekten çekinmeyin, düzeltmek için elimden geleni yapacağım.



İsimlerin ilk harfleri yerine başka semboller tanımlayabilir miyiz, örneğin 0-9 arası rakamlar?
NieDzejkob

@NieDzejkob emin bir şey. Cevabınızda hangi savaşçı için hangi sembollerin kullanıldığını belirttiğinizden emin olun.
J. Sallé

3
Harf yerine özellik olarak girdi almak hile olarak kabul edilir mi? (örnek olarak (health, damage, damagebonus, protbonus))
HyperNeutrino

@HyperNeutrino Tam olarak emin değilim, ama bence iyi olur mu? Bunun size nasıl büyük bir avantaj sağlayabileceğini görmüyorum. NieDzejkob'a söylediğim gibi, cevabınızda her savaşçının neyi temsil ettiğini belirttiğiniz sürece, bunun için gidin.
J. Sallé

Yanıtlar:


3

Python 2 , 576 573 565 554 540 549 bayt

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'

Çevrimiçi deneyin!


Doğru anladıysam, bu biraz: (5in V[i-1:i+2:2])Bitişik skalds ima edebilir hasar. ...*(V[i]!=5)Oraya ihtiyacınız olabilir . Test:print f([S,S],[P]) # says V but should be a Draw
ngn

@ngn Bunun için teşekkürler :)
TFeld

2

APL (Dyalog Klasik) , 128 bayt

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

Çevrimiçi deneyin!

TIO bağlantısında iki işlev vardır: gyukarıdaki golf işlevidir ve fbir çift dizeyi kabul eden, bunları uygun bir gösterime dönüştüren ve golf işlevini çağıran, çözülmemiş bir işlevdir.

Giriş beş matristir: tsavaşçı türleri ints; lhayat; dhasar; bbitişik olduğunda hangi savaşçı tiplerinin bonus verdiği; pkoruma için aynı. Matrisler iki sıradan oluşur - Vikingler ve Saksonlar. Savaşçıları aynı sayı değilse, matrisler 0-yastıklı olmalı, ancak mutlaka ortalanmamalıdır. Sonucudur 1/ ¯1Viking / Sakson zafer için veya 0beraberlik için.

{
  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
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.