एक मैट्रिक्स गुना!


13

मैट्रिक्स को देखते हुए, एक्स को बनाने के लिए उसके मानों को ऊपर / नीचे या बाएँ / दाएँ, इसे मोड़ो और सूची वापस लौटाओ। मैं यहाँ एल्गोरिथ्म का वर्णन करता हूँ:

कलन विधि

आपका इनपुट आपकी भाषा की उचित संख्यात्मक क्षमता के भीतर पूर्णांक का एक विषम आकार का वर्ग मैट्रिक्स होगा।

एक उदाहरण के रूप में निम्नलिखित मैट्रिक्स लेते हैं:

1 2 3 2 1
0 3 2 3 0
4 2 5 6 3
7 4 7 9 4
0 6 7 2 5

सबसे पहले, प्रत्येक संख्या को निकटतम संख्या में जोड़ें जो मुख्य विकर्ण या एंटीडायंगल पर है। यही है, मैट्रिक्स को मुख्य विकर्ण और एंटीडायंगल के साथ चार खंडों में विभाजित करें, और फिर केंद्र की ओर प्रत्येक अनुभाग में सभी संख्याओं को योग करें, जैसे:

1   2   3   2   1
    ↓   ↓   ↓    
0 → 3   2   3 ← 0
        ↓        
4 → 2 → 5 ← 6 ← 3
        ↑        
7 → 4   7   9 ← 4
    ↑   ↑   ↑    
0   6   7   2   5

यह चरण निम्नलिखित परिणाम देता है:

1        1
  5    5
    39
  17  15
0        5

फिर, हम इसे एक्स को समतल करके और तत्वों को ऊपर-बाएं पहले और नीचे के अंतिम भाग के साथ जोड़ते हैं। यह निम्न परिणाम देता है:

1, 0, 5, 17, 39, 5, 15, 1, 5

आप इसे मुख्य विकर्ण को खींचकर और इसे वामावर्त घुमाने के रूप में कल्पना कर सकते हैं।

यह अंतिम परिणाम है।

चुनौती

इस एल्गोरिथ्म को लागू करें। मानक खामियां लागू होती हैं। सभी उचित I / O प्रारूप स्वीकार्य हैं।

परीक्षण के मामलों

Input
Output

1 2 3 2 1
0 3 2 3 0
4 2 5 6 3
7 4 7 9 4
0 6 7 2 5

1, 0, 5, 17, 39, 5, 15, 1, 5

1 2 3 4 5
5 4 3 2 1
1 3 5 7 9
0 9 8 7 6
6 7 8 9 0

1, 6, 11, 16, 47, 7, 22, 5, 0

1 3 7 4 8 5 3
8 4 7 5 3 8 0
0 6 3 6 9 8 4
2 6 5 8 7 4 2
0 6 4 3 2 7 5
0 6 7 8 5 7 4
8 5 3 2 6 7 9

1, 8, 15, 11, 23, 20, 62, 32, 25, 13, 18, 3, 9

क्या आप "नॉट 5 × 5" मैट्रिक्स टेस्ट केस जोड़ सकते हैं?
पूरी तरह से

1
@icrieverytim यहाँ आप जाएँ
HyperNeutrino

जवाबों:


7

जावास्क्रिप्ट, 113 बाइट्स

s=>(l=s.length-1,a=[],s.map((v,y)=>v.map((n,x)=>a[q=2*[x,y,l-y].sort((u,v)=>u-v)[1]+(y>l/2),q-=q>l]=~~a[q]+n)),a)


उम्म .. क्यों ~~? वे एक दूसरे को बेअसर करते हैं, इसलिए उनकी कोई आवश्यकता नहीं है।
केविन क्रूज़सेन

2
@ केविनक्रूजसेन ~~undefined==0, तो यह गोल्फ खिलाड़ी की तुलना में अधिक है (a[q]||0)
नील

@ नील आह, के बारे में नहीं सोचा था undefined। जब मैं परीक्षण का मामला की नकल की TSH इस्तेमाल किया, मैंने देखा कि यह बिना काम किया ~~। और चूँकि ~~xयह -(-x)एक-दूसरे को समान रूप से बेअसर कर रहा है, मुझे लगा कि यह किसी तरह से दुर्घटना से घिर गया है। सुधारों के लिए धन्यवाद।
केविन क्रूज़सेन

5

जेली , 25 23 21 बाइट्स

AṂ×ṠṚ
LHŒRṗ2Ç€ḅLĠịFS€

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

वैकल्पिक संस्करण, 19 बाइट्स

AṂ×ṠṚ
LHŒRṗ2Ç€ĠịFS€

यह काम करने के लिए उपयोग नहीं किया क्योंकि Ġनेस्टेड सरणियों के लिए अनुचित व्यवहार किया। अंतर केवल इतना है कि जोड़े [q, p] में वर्णित है कि यह कैसे काम करता है, छँटाई से पहले p + nq पर मैप करने के बजाय इसे lexicographically हल किया जाता है ।

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

पृष्ठभूमि

हम इसके तत्वों को निर्देशांक के साथ बदलना शुरू करते हैं, बाईं ओर और नीचे की ओर बढ़ते हैं और मैट्रिक्स के केंद्र में (0, 0) रखते हैं

7x7 मैट्रिक्स एम के लिए , हमें निम्नलिखित निर्देश मिलते हैं।

(-3,-3) (-3,-2) (-3,-1) (-3, 0) (-3, 1) (-3, 2) (-3, 3)
(-2,-3) (-2,-2) (-2,-1) (-2, 0) (-2, 1) (-2, 2) (-2, 3)
(-1,-3) (-1,-2) (-1,-1) (-1, 0) (-1, 1) (-1, 2) (-1, 3)
( 0,-3) ( 0,-2) ( 0,-1) ( 0, 0) ( 0, 1) ( 0, 2) ( 0, 3)
( 1,-3) ( 1,-2) ( 1,-1) ( 1, 0) ( 1, 1) ( 1, 2) ( 1, 3)
( 2,-3) ( 2,-2) ( 2,-1) ( 2, 0) ( 2, 1) ( 2, 2) ( 2, 3)
( 3,-3) ( 3,-2) ( 3,-1) ( 3, 0) ( 3, 1) ( 3, 2) ( 3, 3)

अब हम प्रत्येक समन्वय जोड़ी के न्यूनतम निरपेक्ष मान की गणना करते हैं और इसके द्वारा समन्वय दोनों के संकेतों को गुणा करते हैं, मैपिंग (i, j) से (साइन (i) m, साइन (j) m) , जहाँ m = min (| i) | , | j |)

(-3,-3) (-2,-2) (-1,-1) ( 0, 0) (-1, 1) (-2, 2) (-3, 3)
(-2,-2) (-2,-2) (-1,-1) ( 0, 0) (-1, 1) (-2, 2) (-2, 2)
(-1,-1) (-1,-1) (-1,-1) ( 0, 0) (-1, 1) (-1, 1) (-1, 1)
( 0, 0) ( 0, 0) ( 0, 0) ( 0, 0) ( 0, 0) ( 0, 0) ( 0, 0)
( 1,-1) ( 1,-1) ( 1,-1) ( 0, 0) ( 1, 1) ( 1, 1) ( 1, 1)
( 2,-2) ( 2,-2) ( 1,-1) ( 0, 0) ( 1, 1) ( 2, 2) ( 2, 2)
( 3,-3) ( 2,-2) ( 1,-1) ( 0, 0) ( 1, 1) ( 2, 2) ( 3, 3)

मैट्रिक्स के तत्व जो एक ही जोड़ी के अनुरूप होते हैं, उन्हें संक्षेप में प्रस्तुत करना होता है। रकम के क्रम को निर्धारित करने के लिए, हम प्रत्येक जोड़ी (p, q) से p + nq पर मैप करते हैं , जहाँ n , M की पंक्तियों / स्तंभों की संख्या है ।

-24 -16  -8   0   6  12  18
-16 -16  -8   0   6  12  12
 -8  -8  -8   0   6   6   6
  0   0   0   0   0   0   0
 -6  -6  -6   0   8   8   8
-12 -12  -6   0   8  16  16
-18 -12  -6   0   8  16  24

रकम का क्रम पूर्णांक के अनुरूपों के क्रम से मेल खाता है।

यह काम किस प्रकार करता है

LHŒRṗ2Ç€ḅLĠịFS€  Main link. Argument: M (matrix)

L                Compute n, the length (number of rows) of M.
 H               Halve it.
  ŒR             Symmetric range; map t to [-int(t), ..., 0, int(t)].
    ṗ2           Compute the second Cartesian power, yielding all pairs [i, j]
                 with -t ≤ i, j ≤ t.
      ǀ         Map the helper link over the resulting array of pairs.
         L       Yield n.
        ḅ        Unbase; map each pair [q, p] to (p + nq).
          Ġ      Group the indices of the resulting array of n² integers by their
                 corresponding values, ordering the groups by the values.
            F    Flatten M.
           ị     Index into the serialized matrix.
             S€  Compute the sum of each group.


AṂ×ṠṚ            Helper link. Argument: [i, j] (index pair)

A                Absolute value; yield [|i|, |j|].
 Ṃ               Minimum; yield m := min(|i|, |j|).
   Ṡ             Sign; yield [sign(i), sign(j)].
  ×              Multiply; yield [p, q] := [sign(i)m, sign(j)m].
    Ṛ            Reverse; yield [q, p].

5
ये जबरदस्त है।
यूरिल



2

APL (Dyalog) , 60 बाइट्स *

मेरे सहयोगी मार्शल के सहयोग से ।

अनाम उपसर्ग लंबोदर। मैट्रिक्स को तर्क के रूप में लेता है और वेक्टर को लौटाता है। मान लिया गया है ⎕IO ( मैं ndex हे rigin) शून्य है, जो कई सिस्टम पर डिफ़ॉल्ट है किया जाना है।

{(,⍉{+/,(s×-×⍺)↓⍵×i∊¨⍨s←⌊⊃r÷2}⌺r⊢⍵)/⍨,(⊢∨⌽)=/¨i←⍳r←⍴⍵}

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

{} गुमनाम लंबोदर; सही तर्क है (ग्रीक वर्णमाला का सबसे सही अक्षर):

⍴⍵ तर्क का आकार (दो समान तत्वों की सूची)

r← दुकान के रूप में r( आर हो में)

 सभी ɩ है कि आकार की एक सरणी के ndices, यानी (0 0), (0 1)...

i← में स्टोर i(के रूप में मैं ota)

=/¨ बूलियन जहां निर्देशांक समान हैं (यानी विकर्ण)

() इस अनाम tacit उपसर्ग फ़ंक्शन को लागू करें:

   तर्क को उलट दें

  ⊢∨ या कि असम्बद्ध तर्क के साथ

, ravel (सरल सूची में सीधा करें)

 अब हमारे पास विकर्णों के लिए बुलियन मुखौटा है।

()/⍨ निम्नलिखित को फ़िल्टर करने के लिए उपयोग करें:

  ⊢⍵ उपज ( rतर्क से अलग करने के लिए )

  {}⌺r प्रत्येक तत्व पर निम्नलिखित अनाम infix lambda को कॉल करें, r-neighbourhood के साथ (आवश्यक के रूप में शून्य के साथ गद्देदार ), सही तर्क ( ) के रूप में, और संख्या गद्देदार पंक्तियों की एक दो तत्व सूची, कॉलम (नीचे / सही के लिए नकारात्मक, शून्य से कोई नहीं) बाएं तर्क के रूप में ( ):

   r÷2rदो से  विभाजित करें

    पहला तत्व चुनें (वे समान हैं)

    मंजिल यह

   s← स्टोर के रूप में s( s hape के लिए)

   i∊⍨¨iबुलियन के  प्रत्येक तत्व के लिए , यदि sउसका कोई सदस्य है

   ⍵× पड़ोस में गुणा करें

   ()↓ निम्न पंक्तियों और स्तंभों को छोड़ें (नीचे / दाएं के लिए ऋणात्मक):

    ×⍺ बाएं तर्क के हस्ताक्षर (यानी पैडिंग की दिशा)

    - निगेट

     गुणा sउससे

   , उठाव (सूची में सीधा)

   +/ योग (प्लस में कमी)

अब हमारे पास रकम का पूरा मैट्रिक्स है, लेकिन हमें कॉलमवाइज़ पढ़ने वाले सभी मूल्यों को फ़िल्टर करने की आवश्यकता है।

   पक्षांतरित

  , ravel (सरल सूची में सीधा करें)


* के रूप में गिनती करके ⎕U233A इसे ऑनलाइन आज़माएं!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.