The Shield Wall


18

Sfondo storico

La parete dello scudo è una formazione tattica di guerra che risale almeno al 2500 a.C. Consisteva in guerrieri che si sovrapponevano ai loro scudi con quelli dei loro compagni per formare un "muro". Il fascino della tattica deriva dal fatto che anche il guerriero più abile poteva combattere contro un muro purché avessero uno scudo e un'arma. A causa della vicinanza delle mura, c'era poco spazio per muoversi e la battaglia di solito si trasformava in un fiammifero combattuto con armi affilate.

La sfida

Il tuo compito è creare un programma o una funzione che, dati due array / elenchi / vettori di guerrieri come input, decida l'esito della battaglia. Gli elenchi rappresenteranno un muro a linea singola di scudi e seguiranno una notazione specifica:

Vikings:

I guerrieri nordici avevano una forte spinta alla battaglia. Tra la fine dell'ottavo e la metà dell'XI secolo, i vichinghi danesi invasero i regni della Gran Bretagna in cerca di ricchezza e terra coltivabile. Ai fini di questa sfida, questi sono i guerrieri vichinghi:

  • L' Jarl: di solito si trovava a condurre i suoi uomini dal centro del muro, i vasetti erano i capi delle orde vichinghe. Subisce 15 danni per morire e infligge 2 danni per round.
  • The Berserker: Sebbene la fantasia abbia notevolmente distorto l'immagine dei berserker, questi guerrieri erano noti per combattere in una furia simile a una trance senza alcun tipo di protezione diversa dai loro scudi. Subisce 6 danni per morire e infligge 3 danni per round.
  • The Chieftain: Chieftain erano uomini ricchi che avevano uomini liberi al loro servizio. Di solito si sarebbero guadagnati grande gloria e ricchezza in battaglia. Subisce 10 danni per morire e infligge 2 danni per round.
  • The Free Men: Warriors che ha servito un capotribù. Avevano giurato di combattere per i loro signori fino alla morte. Subisce 8 danni per morire e infligge 1 danno per round.
  • The Skald: Skalds, di solito tradotto come bardi, erano uomini liberi che venivano assunti per scrivere poesie, storie o canzoni sulle grandi gesta dei guerrieri nordici. Subisce 8 danni per morire e infligge a ciascun guerriero adiacente 1 danno bonus. Gli Skald non infliggono danni. I guerrieri non possono ottenere più di 1 danno bonus in questo modo.

Sassoni:

I sassoni arrivarono a stabilirsi in Gran Bretagna dall'Europa continentale in seguito alla scomparsa dell'Impero romano nel V secolo. Ai fini di questa sfida, ci sono guerrieri dei sassoni:

  • L' Earl: Ealdormen , comunemente chiamato Conte, erano membri della nobiltà superiore. Di solito possedevano grandi distese di terra e avevano centinaia o addirittura migliaia di uomini giurati. Subisce 20 danni per morire e infligge 1 danno per round.
  • La Knotte: per mancanza di un termine migliore, i cavalieri erano nobili minori che possedevano un po 'di terra. Nella maggior parte dei casi, i cavalieri erano servitori giurati di un conte. Subisce 10 danni per morire e infligge 2 danni per round.
  • The Warrior: uomini comuni, di solito nobili minori senza terra o contadini che servivano un cavaliere. Quando sono adiacenti a un Cavaliere o Conte, i guerrieri hanno un bonus al danno di +1. Subisce 8 danni per morire e infligge 2 danni per round.
  • L' Fanno: il Fyrd era un gruppo di uomini liberi simili alla milizia, di solito poveri agricoltori, che portavano qualsiasi arma (o attrezzo agricolo simile ad un'arma) che dovevano combattere contro il muro. Subisce 5 danni per morire e infligge 1 danno per round.
  • La Privolta: i sacerdoti erano molto apprezzati nella prima cultura sassone, essendo araldi delle parole di Dio. I preti subiscono 15 danni per morire e prevengono fino a 1 danno per ogni guerriero adiacente. I sacerdoti non infliggono danni. I sacerdoti non possono prevenire più di 1 danno a un guerriero.

Il muro

Le pareti si incontrano nei loro centri. Ogni round, ogni guerriero assegna danni al guerriero direttamente di fronte a lui o, se non c'è nessun guerriero vivente di fronte ad esso, il guerriero vivente adiacente in diagonale con meno salute rimanente. Se c'è un pareggio, scegli il guerriero più vicino al bordo del muro.

Esempio:

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.

Regole:

  • Si applicano le lacune predefinite .
  • È possibile utilizzare qualsiasi metodo IO conveniente .
  • Questo è , quindi vince il codice più breve (in byte, per lingua).
  • Non puoi presumere che le liste abbiano la stessa lunghezza, ma saranno sempre allineabili nei loro centri (ci sarà sempre un numero dispari di guerrieri in ciascuna lista se le liste sono di dimensioni diverse).
  • È possibile generare qualsiasi valore di verità / falsità. Specifica nella tua risposta gli equivalenti di "Vittoria vichinga / sassone".
  • Il perdente è determinato quando tutti i guerrieri di un muro sono morti.
  • Se ti capita di finire con muri che non sono allineabili durante l'esecuzione del codice, allineali il più centralmente possibile, lasciando un guerriero in più sul muro più lungo sul lato destro. Per esempio:

      [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]
    
  • Sentiti libero di provare e testare il tuo codice con qualsiasi configurazione di muri, non solo quelli nei casi di test.

Casi test:

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

Ci sono alcune inesattezze storiche. Sentiti libero di indicarli e farò del mio meglio per risolverli.



Possiamo definire altri simboli invece delle prime lettere dei nomi, ad esempio i numeri 0-9?
NieDzejkob,

@NieDzejkob certo. Assicurati di specificare nella tua risposta quali simboli sono stati usati per quale guerriero.
J. Sallé,

3
Sarebbe considerato imbroglio prendere l'input come proprietà piuttosto che come lettere? (esempio come (health, damage, damagebonus, protbonus))
HyperNeutrino,

@HyperNeutrino non sono esattamente sicuro, ma penso che andrebbe bene? Non vedo come ciò possa darti un grande vantaggio. Come ho detto a NieDzejkob, fintanto che nella tua risposta specifichi cosa rappresenta ogni guerriero, provaci.
J. Sallé,

Risposte:


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'

Provalo online!


Se ho capito bene, questo bit: (5in V[i-1:i+2:2])implica che gli skald adiacenti possono infliggere danni. Potrebbe essere necessario un ...*(V[i]!=5)lì. Test:print f([S,S],[P]) # says V but should be a Draw
ngn

@ngn Grazie per quello :)
TFeld il

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}

Provalo online!

Esistono due funzioni nel collegamento TIO: gè la funzione golf sopra ed fè una funzione non golf che accetta una coppia di stringhe, le converte in una rappresentazione adatta e chiama la funzione golf.

L'input è di cinque matrici: ttipi di guerriero come ints; lvita; ddanno; bquali tipi di guerrieri danno bonus quando sono adiacenti; plo stesso per protezione. Le matrici sono composte da due file: Vichinghi e Sassoni. Se i loro guerrieri non hanno lo stesso numero, le matrici devono essere 0, anche se non necessariamente centrate. Il risultato è 1/ ¯1per la vittoria di Viking / Saxon o 0per un pareggio.

{
  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
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.