शील्ड की दीवार


18

ऐतिहासिक पृष्ठभूमि

ढाल की दीवार एक सामरिक युद्ध गठन है जो कम से कम 2500 ईसा पूर्व की है। इसमें योद्धाओं का समावेश था, जिन्होंने अपने साथियों के साथ मिलकर एक 'दीवार' बनाई। रणनीति की अपील इस तथ्य से आती है कि सबसे अकुशल योद्धा भी एक दीवार में लड़ सकता था जब तक उनके पास एक ढाल और एक हथियार था। दीवारों की निकटता के कारण, चारों ओर घूमने के लिए बहुत कम जगह थी, और लड़ाई आमतौर पर तेज हथियारों के साथ लड़ा जाने वाला एक शेवरिंग मैच बन गया।

चुनौती

आपका काम एक प्रोग्राम या फ़ंक्शन बनाना है, जो इनपुट के रूप में योद्धाओं के दो सरणियों / सूचियों / वैक्टर को देता है, लड़ाई के परिणाम को तय करता है। सूचियाँ शील्ड्स की एकल-पंक्ति दीवार का प्रतिनिधित्व करेंगी, और वे एक विशिष्ट संकेतन का पालन करेंगी:

वाइकिंग्स:

नॉर्डिक योद्धाओं के पास युद्ध के लिए एक भयंकर अभियान था। 11 वीं शताब्दी के उत्तरार्ध में 8 वीं शताब्दी के अंत के दौरान, डेनिश वाइकिंग्स ने धन और कृषि योग्य भूमि की तलाश में ब्रिटेन के राज्यों पर आक्रमण किया। इस चुनौती के उद्देश्य के लिए, ये वाइकिंग्स योद्धा हैं:

  • JARL: आमतौर पर दीवार के केंद्र से उसके आदमियों अग्रणी पाया, jarls वाइकिंग भीड़ के नेता थे। मरने के लिए 15 क्षति लेता है, और प्रति चक्कर में 2 क्षति का सामना करता है।
  • BErserker: हालांकि कल्पना बहुत Berserkers की छवि मुड़ गया है, इन योद्धाओं उनकी ढाल के अलावा अन्य सुरक्षा के किसी भी प्रकार के बिना एक रोष ट्रान्स की तरह में लड़ने के लिए जाने जाते थे। मरने के लिए 6 नुकसान उठाता है, और प्रति चक्कर 3 क्षति का सौदा करता है।
  • CHieftain: सरदारों अमीर पुरुषों के लिए जो उनकी सेवा पर मुफ्त पुरुषों थे। वे आम तौर पर युद्ध में महान महिमा और धन अर्जित करते थे। मरने के लिए 10 क्षति लेता है, और प्रति चक्कर में 2 क्षति का सामना करता है।
  • फ्री Mएन: योद्धाओं ने एक सरदार की सेवा की। उन्हें मरते दम तक अपने प्रभु के लिए लड़ने की शपथ दिलाई गई। मरने के लिए 8 क्षति लेता है, और प्रति चक्कर 1 क्षति का सौदा करता है।
  • SKald: Skalds, आमतौर पर bards के रूप में अनुवाद, मुक्त पुरुषों के लिए जो कविताएं, नॉर्डिक योद्धाओं के महान कामों के बारे में कहानियों या गाने लिखने के लिए काम पर रखा गया था। मरने के लिए 8 नुकसान उठाता है, और प्रत्येक आसन्न योद्धा को 1 बोनस क्षति देता है। Skalds कोई नुकसान नहीं पहुंचाते। योद्धा इस तरह से 1 से अधिक बोनस नुकसान नहीं उठा सकते हैं

सक्सोंस:

5 वीं शताब्दी में रोमन साम्राज्य के निधन के बाद सक्सोन महाद्वीपीय यूरोप से ब्रिटेन में आकर बस गए। इस चुनौती के प्रयोजनों के लिए, सैक्सन के योद्धा हैं:

  • EARL: Ealdormen , आमतौर पर अर्ल्स कहा जाता है, उच्च बड़प्पन के सदस्य थे। वे आम तौर पर जमीन के बड़े हिस्से रखते थे और सैकड़ों या हजारों शपथ खाते थे। मरने के लिए 20 क्षति लेता है, और प्रति चक्कर 1 क्षति का सौदा करता है।
  • Kरात: एक बेहतर शब्द की कमी के लिए, शूरवीर नाबालिग कुलीन जो कुछ भूमि के स्वामित्व वाले थे। ज्यादातर मामलों में, शूरवीरों ने एक अर्ल को नौकरों की शपथ दिलाई थी। मरने के लिए 10 क्षति लेता है, और प्रति चक्कर में 2 क्षति का सामना करता है।
  • Wएरियर: आम आदमी, आम तौर पर बिना भूमि के मामूली रईस या शूरवीर की सेवा करने वाले किसान। जब एक नाइट या अर्ल से सटे, योद्धाओं को +1 नुकसान बोनस होता है। मरने के लिए 8 क्षति लेता है, और प्रति चक्कर में 2 क्षति का सामना करता है।
  • FYrd: Fyrd था एक मिलिशिया की तरह स्वतंत्र लोगों, आम तौर पर गरीब किसानों, जो किसी भी हथियार (या लागू खेती हथियार की तरह) वे दीवार में लड़ने के लिए किया था लाने चाहते हैं का समूह। मरने के लिए 5 क्षति लेता है, और प्रति चक्कर 1 क्षति का सौदा करता है।
  • Pरिस्ट: भगवान के शब्दों के हेराल्ड होने के कारण प्रारंभिक सैक्सन संस्कृति में पुजारी अत्यधिक मूल्यवान थे। पुजारी मरने के लिए 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 पक्की बात। बस यह सुनिश्चित करें कि आप अपने उत्तर में निर्दिष्ट करें कि किन योद्धाओं के लिए प्रतीकों का उपयोग किया गया था।
जे। सल्ल।

3
क्या पत्रों के बजाय उनके गुणों के रूप में इनपुट लेना धोखा माना जाएगा? (उदाहरण के रूप में (health, damage, damagebonus, protbonus))
हाइपरएन्यूट्रीनो

@ HyperNeutrino मुझे बिल्कुल यकीन नहीं है, लेकिन मुझे लगता है कि यह ठीक होगा? मैं नहीं देखता कि कैसे आपको एक बड़ा फायदा मिल सकता है। जैसा कि मैंने NieDzejkob को बताया, जब तक आप अपने उत्तर में निर्दिष्ट करते हैं कि प्रत्येक योद्धा का प्रतिनिधित्व क्या है, इसके लिए जाएं।
जे। सल्ल।

जवाबों:


3

पायथन 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])समझूं तो यह बिट: तात्पर्य है कि आसन्न स्कैल्ड क्षति को भड़का सकते हैं । आपको ...*(V[i]!=5)वहां जरूरत पड़ सकती है । टेस्ट:print f([S,S],[P]) # says V but should be a Draw
ngn

@ngn उस के लिए धन्यवाद :)
12

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}

इसे ऑनलाइन आज़माएं!

gटीआईओ लिंक में दो कार्य हैं: ऊपर गॉल्फ़्ड फ़ंक्शन है और fएक अनगॉल्फ़ड फ़ंक्शन है जो स्ट्रिंग्स की एक जोड़ी को स्वीकार करता है, उन्हें एक उपयुक्त प्रतिनिधित्व में परिवर्तित करता है और गॉल्फ़्ड फ़ंक्शन को कॉल करता है।

इनपुट पांच मैट्रीस है: tयोद्धा प्रकार के रूप में; lजिंदगी; dक्षति; bनिकटवर्ती होने पर योद्धा किस प्रकार का बोनस देता है; pसुरक्षा के लिए भी। मैट्रिसेस में दो पंक्तियाँ होती हैं - वाइकिंग्स और सैक्सन। यदि उनके योद्धा समान संख्या में नहीं हैं, तो मेट्रिस को 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
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.