गैर-अतिव्यापी मैट्रिक्स सम


25

गैर-अतिव्यापी मैट्रिक्स सम

लंबाई n के k सरणियों को देखते हुए , प्रत्येक सरणी से एक तत्व का उपयोग करके अधिकतम संभव राशि का उत्पादन करें जैसे कि कोई भी दो तत्व एक ही सूचकांक से नहीं हैं। यह गारंटी है कि k <= n।

इनपुट

पूर्णांक की गैर-रिक्त सरणियों की एक गैर-रिक्त सूची।

उत्पादन

एक पूर्णांक जो अधिकतम राशि का प्रतिनिधित्व करता है।

उदाहरण

Input -> Output
[[1]] -> 1
[[1, 3], [1, 3]] -> 4
[[1, 4, 2], [5, 6, 1]] -> 9
[[-2, -21],[18, 2]] -> 0
[[1, 2, 3], [4, 5, 6], [7, 8, 9]] -> 15
[[1, 2, 3, 4], [5, 4, 3, 2], [6, 2, 7, 1]] -> 16
[[-2, -1], [-1, -2]] -> -2

5
गणित मजेदार तथ्य: वर्ग सरणियों के लिए, यह उष्णकटिबंधीय सेमिनार पर स्थायी मैट्रिक्स है जो (+, *) के स्थान पर संचालन (अधिकतम, +) का उपयोग करता है।
22

जवाबों:


9

जेली , 10 6 बाइट्स

ZŒ!ÆṭṀ

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

(4 बाइट्स @ डेनिस द्वारा बचाए गए, जिन्होंने बताया कि जेली के पास "मुख्य विकर्ण का योग" बिलिन था। मुझे उम्मीद नहीं थी कि उनमें से एक है; पिछले समाधान ने बिनिन का उपयोग किए बिना ऑपरेशन को लागू किया था। प्रश्न में ऑपरेशन। Æṭ, "ट्रेस" के रूप में परिभाषित किया गया है, लेकिन ट्रेस केवल वर्ग मैट्रिसेस के लिए परिभाषित किया गया है, जेली आयताकार मैट्रीक के लिए एक सामान्यीकरण को लागू करता है।)

अन्य उत्तरों में सुधार ज्यादातर एल्गोरिथ्म (इस तरह से व्यक्त करने के लिए चिढ़ा) एल्गोरिथ्म से होता है; यह प्रोग्राम मूल रूप से Brachylog v2 ( {\p\iᶠ∋₎ᵐ+}ᶠot) में लिखा गया था , लेकिन Jelly के पास कुछ प्रोग्राम के कुछ भाग हैं, जिन्हें Brachylog में वर्तनी देना है, इसलिए यह छोटा हो गया।

व्याख्या

ZŒ!ÆṭṀ
Z            Swap rows and columns
 Œ!          Find all permutations of rows (thus columns of the original)
   Æṭ        {For each permutation}, take the sum of the main diagonal
     Ṁ       Take the maximum

यह स्पष्ट होना चाहिए कि समस्या के किसी भी समाधान के लिए, हम मूल मैट्रिक्स के कॉलम को मुख्य विकर्ण पर डालने के लिए अनुमति दे सकते हैं। तो यह समाधान बस पलटता है, क्रमपरिवर्तन के सभी संभावित मुख्य विकर्णों को खोजता है।

ध्यान दें कि "कॉलम को अनुमति दें" ऑपरेशन "ट्रांज़ोज़, पंक्तियों की अनुमति दें" के रूप में किया जाता है, बिना वापस ट्रांसफर किए बिना; एल्गोरिथ्म के बाकी मुख्य विकर्ण के बारे में सममित होने के लिए होता है, इसलिए हमें संक्रमण को पूर्ववत करने की आवश्यकता नहीं है और इस तरह एक बाइट को बचा सकता है।


ZŒ!ÆṭṀचार बाइट बचाता है। इसे ऑनलाइन आज़माएं!
डेनिस

वैसे ऐसा लगता है कि डेनिस को आखिरी शब्द मिला: P
Quintec

मुझे आश्चर्य है कि अगर उस बिल्डिन पहले कभी आया है?
अनीस 2323

यकीन नहीं होता, लेकिन शायद नहीं। मैंने वास्तव में ZŒ!ŒD§ṀḢयाद करने से पहले सुझाव दिया Æṭथा कि यह एक बात थी।
डेनिस

8

जे , 28 बाइट्स

>./@({.+1$:@|:\.|:@}.)@[^:]#

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

 >./ @  (   {.   +         1 $:@|:\. |:@}.       )       @[^:] #
(max of (1st row + recursive call on each "minor")) or count of arg if 0

यहां पुनरावर्ती कॉल किया जाता है $:जिसके द्वारा सबसे बड़ा अनाम फ़ंक्शन का प्रतिनिधित्व करता है। हम जम्मू में भाग्यशाली हैं कि वह आदिम है x u\. y, जो वस्तुओं की लंबाई के क्रमिक infixes को दबाकर प्राप्त uकी "क्रमबद्धता" पर लागू होता है ; यहाँ हम "नाबालिग" पाने के लिए लगातार स्तंभों को प्राप्त करना चाहते हैं, इसलिए हम निम्न पंक्तियों (या पूंछ ) को स्थानांतरित करते हैं , और फिर उनके उपसर्गों के संक्रमण पर पुनरावृत्ति करते हैं।yxy|:}.y


2
नमस्ते और PPCG में आपका स्वागत है! मैंने आपके समाधान के लिए इसे एक ऑनलाइन लिंक आज़माया, ताकि दूसरे इसे सत्यापित कर सकें।
गैलन इवानोव

7

पायथन 3 , 94 90 89 84 80 बाइट्स

-4 बाइट्स xnor के लिए धन्यवाद (सूचियों के बजाय सेट का उपयोग करके)!

f=lambda x,y={-1}:x>[]and max(e+f(x[1:],y|{i})for(i,e)in enumerate(x[0])if{i}-y)

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


अच्छी विधि! आप yसदस्यता जांच को छोटा करने के लिए एक सेट बना सकते हैं f=lambda x,y={-1}:x>[]and max(e+f(x[1:],y|{i})for(i,e)in enumerate(x[0])if{i}-y):।
xnor

@xnor: यह -1ट्रिक वाकई बहुत चालाक है :) बहुत बहुत धन्यवाद!
ბიმო

7

भूसी , 12 11 9 बाइट्स

▲mȯΣ►L∂PT

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

Ais523 के उत्तर का एक पोर्ट सुझाने के लिए BMO को धन्यवाद और 2-बाइट बचाने , जिसे मैंने आगे सुधारने में कामयाब किया, और बदले में BMO ने 2 और बाइट्स का मुंडन किया।


पिछला समाधान (14 बाइट्स)

▲moΣz!¹fS=uΠmŀ

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

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

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

कोड टूटना

▲moΣz!¹fS=uΠmŀ     Full program. Takes a 2D list from CLA 1 and outputs to STDOUT.
            mŀ     Length range of each list. 
           Π       Cartesian product.
       fS=u        Discard those combinations which have at least 1 non-unique element.
 mo                Map over the combinations with the following predicate:
    z!¹            Zip the 2D list input with the current combination and index accordingly.
   Σ               Sum the resulting elements.
▲                  Finally, pick the maximum.

उदाहरण

आइए एक उदाहरण चुनें:

(142561)

प्रत्येक को वास्तव में एक इंडेक्स चुनना चाहिए, जो कि कोई दो सूचकांक नहीं है। इसलिए, हम पंक्तियों की लंबाई श्रृंखला उत्पन्न करते हैं और केवल उन डुप्लिकेट के बिना रखते हैं, निम्नलिखित संयोजनों की उपज (प्रत्येक संयोजन अंतरिक्ष को बचाने के लिए एक पंक्ति के बजाय एक स्तंभ है):

(121323213132)

फिर, प्रोग्राम संयोजन के प्रत्येक तत्व के साथ इनपुट सूचियों में अनुक्रमित करता है, लौटता है:

(141242651516)

9


5

जावास्क्रिप्ट (ईएस 6),  74  71 बाइट्स

2 बेकार बाइट्स की पहचान करने के लिए @tsh के लिए धन्यवाद, जो एक बग को ठीक करने के लिए उपयोग किए गए थे
3 बाइट्स @tsh के लिए धन्यवाद

f=([a,...r],k,i=1)=>a?Math.max(...a.map(n=>k&(i+=i)?-1/0:n+f(r,k|i))):0

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


@Shaggy लेकिन यह रचना के लिए असंभव है 0, इनपुट सरणी से -1+(-1)है -2और यह सही जवाब है।
वैल का कहना है कि मोनिका

1
f=([a,...r],k,i=1)=>a?Math.max(...a.map(c=>k&(i+=i)?-1/0:c+f(r,k|i))):0यह अजीब है, लेकिन Math.maxबाइट्स बचाता है ...
टीएच

4

जेली , 13 12 बाइट्स

ẈŒpQƑƇị"€¹§Ṁ

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

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

ZLœ!Lị"€¹§Ṁ

यह नए जोड़े गए œ!बिल्ट-इन का उपयोग करता है, जो किसी दिए गए लंबाई के सभी क्रमपरिवर्तन उत्पन्न करता है।

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

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

ẈŒpQƑƇị"€¹§Ṁ  Main link. Argument: M (matrix)

Ẉ             Widths; compute the length of each row.
              For an n×m matrix, this yields an array m copies of n.
 Œp           Cartesian product; promote each n to [1, ..., n], then form all arrays
              that pick one k out of all m copies of [1, ..., n].
   QƑƇ        Comb by fixed unique; keep only arrays that do not change by
              deduplicating their entries.
         ¹    Identity; yield M.
      ị"€     For each of the arrays of unique elements, use its m entries to index
              into the m rows of M.
          §   Take the sums of all resulting vectors.
           Ṁ  Take the maximum.

आह ... मैंने XLṗLइसके बजाय लगभग यही उत्तर पोस्ट किया है J€Œp
E से

4

हास्केल , 65 बाइट्स

f(u:v)=maximum[e+f(take i<>drop(i+1)<$>v)|(i,e)<-zip[0..]u]
f _=0

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

स्पष्टीकरण और असंगति

फ़ंक्शन take i<>drop(i+1)एक सूची लेता है और स्थिति में तत्व को निकालता है i

फ़ंक्शन को स्थिति में fप्रत्येक संभव तत्व प्राप्त होता है, शेष तत्वों से स्थिति पर तत्वों को हटाता है और पुन: गणना किए गए इष्टतम में जोड़ता है:eiie

f(u:v)=maximum[e+f(removeElementAt i<$>v)|(i,e)<-zip[0..]u]

और खाली सूची के लिए आधार मामला सिर्फ 0:

f _=0

2

ब्रेकीलॉग , 18 बाइट्स

{hl⟦kp;?z₀∋₍ᵐ+}ᶠot

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

व्याख्या

                ot      The output is the biggest result of…
{             }ᶠ        …finding all outputs to the following predicate:
 hl⟦k                     Construct the range [0, …, n-1]
     p                    Take a permutation of that range
      ;?z₀                Zip that permutation with the Input, stopping when all elements of
                            the input are used (important because the range is possibly
                            bigger than the length of the input)
          ∋₍ᵐ             In each element of the zip, take the head'th element of the tail
             +            Sum the result

2

पर्ल 6 , 50 49 बाइट्स

{max map *.map({.[$++]}).sum,permutations [Z] $_}

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

लंबे समय के बावजूद भी कम है permutations कॉल के । यह एक अनाम कोड ब्लॉक है जो सूची की सूची लेता है और एक नंबर देता है।

स्पष्टीकरण:

{                                               } # Anonymous code block
 max                                              # Finds the maximum
                             permutations         # Of all permutations
                                          [Z] $_  # Of the transposed input
     map                                          # When mapped to
                        .sum # The sum of
         *.map({.[$++]})     # The diagonal of the matrix

2

K (oK) , 40, 32, 28, 19 बाइट्स

-13 बाइट्स ngn के लिए धन्यवाद!

{|/+/(prm'x)@''!#x}

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

प्रारंभिक समाधान:

{|/+/'x./:/:(*t),'/:t:{x~?x}#+!(#x)##*x}

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

नोट: पहले परीक्षण मामले के लिए काम नहीं करता [[१]]

स्पष्टीकरण:

{ } - तर्क के साथ कार्य करें x

                                   #     - creata a list
                               (#x)      - with length number of rows of x
                                    #*x  - of the length of the first row
                              !          - odometer (ranged permutations)
                             +           - transpose
                            #            - filter out the rows
                      {x~?x}             - that have duplicates
                    t:                   - save it to t 
                ,'/:                     - pair up each number in each row with
            (*t)                         - a number from the first row
      x./:/:                             - index x with each of the above
   +/'                                   - find the sum of each row
 |/                                      - reduce by max

1
संकेत: prmअपने क्रमपरिवर्तन के लिए सीधे सूची में लागू किया जा सकता है
ngn

@ng धन्यवाद! मैं मुख्य विकर्ण का उपयोग करना चाहता था =, लेकिन परिणाम लंबा था। वहाँ है flattenठीक है?
गैलेन इवानोव

flattenकिस तरीके से?
ngn

@ngn(1 2 3; 4 5 6; 7 8 9) -> (1 2 3 4 5 6 7 8 9)
गैलेन इवानोव

1
यह सिर्फ ,/या अगर आप चाहते हैं कि यह गहरी संरचनाओं में जाए:,//
nn

2

हास्केल , 65 बाइट्स

([]%)
p%(h:t)=maximum[x+(i:p)%t|(i,x)<-zip[0..]h,all(/=i)p]
p%_=0

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


71 बाइट्स

f m=maximum[sum b|(a,b)<-unzip<$>mapM(zip[0..])m,[x|x<-a,y<-a,x==y]==a]

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

[x|x<-a,y<-a,x==y]==aजांच करता है कि के तत्वों aअलग हैं। यह वर्णों की एक आश्चर्यजनक संख्या का उपयोग करता है, लेकिन मैंने इससे छोटा तरीका नहीं देखा।


1

पायथ, 15 12 बाइट्स

eSms@VQd.plh

इसे यहाँ ऑनलाइन आज़माएँ ।

eSms@VQd.plhQ   Implicit: Q=eval(input())
                Trailing Q inferred
          lhQ   Length of first element of Q
        .p      Generate all permutaions of 0 to the above
  m             Map the elements of the above, as d, using:
    @VQd          Vectorised index into Q using d
                    For i in [0-length(Q)), yield Q[i][d[i]]
   s              Take the sum of the above
 S              Sort the result of the map
e               Take the last element of the above, implicit print

संपादित करें: issacg के 3 बाइट शिष्टाचार सहेजे गए


1
.PUlhQlद्वारा प्रतिस्थापित किया जा सकता है .plhVस्पष्ट रूप से किसी भी अतिरिक्त प्रविष्टियों की उपेक्षा करता है
isaacg

1

05AB1E , 18 13 बाइट्स

нgLœε‚øε`è]OZ

मुझे लग रहा है कि यह बहुत लंबा है, लेकिन मुझे यकीन नहीं है कि 05AB1E में वेक्टर इंडेक्सिंग बाइट-कुशलता से कैसे किया जाए .. और मैं वास्तव में सही था कि यह बहुत लंबा था .. -5 बाइट्स @Emigna के लिए धन्यवाद ।

इसे ऑनलाइन आज़माएं या सभी परीक्षण मामलों को सत्यापित करें

स्पष्टीकरण:

н                # Take the first inner list (of the implicit input list of lists)
 g               # Pop and take its length
  L              # Create a list in the range [1, inner-length]
   œ             # Create each possible permutation of this range-list
    ε            # Map each permutation to:
                #  Pair it with the (implicit) input
      ø          #  Transpose; swap rows/columns
       ε         #  Map each to:
        `        #   Push both to the stack
         è       #   Index the permutation-nr into the inner list of the input
    ]            # Close both maps
     O           # Take the sum of each inner list
      à          # Pop and push the maximum (and output implicitly)

उदाहरण रन:

  • इनपुट: [[1,4,2],[5,6,1]]
  • चरण 1 ( нgL) के बाद :[1,2,3]
  • चरण 2 ( œ) के बाद :[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
  • चरण 3 ( ε‚) के बाद :[[[[1,4,2],[5,6,1]],[1,2,3]],[[[1,4,2],[5,6,1]],[1,3,2]],[[[1,4,2],[5,6,1]],[2,1,3]],[[[1,4,2],[5,6,1]],[2,3,1]],[[[1,4,2],[5,6,1]],[3,1,2]],[[[1,4,2],[5,6,1]],[3,2,1]]]
  • चरण 4 के बाद ( ø):[[[[1,4,2],1],[[5,6,1],2]],[[[1,4,2],1],[[5,6,1],3]],[[[1,4,2],2],[[5,6,1],1]],[[[1,4,2],2],[[5,6,1],3]],[[[1,4,2],3],[[5,6,1],1]],[[[1,4,2],3],[[5,6,1],2]]]
  • चरण 5 (के बाद ε`è]): [[4,1],[4,5],[2,6],[2,5],[1,6],[1,1]](नोट: 05AB1E, 0 अनुक्रमित है (स्वचालित wraparound के साथ) तो अनुक्रमण 3में[5,6,1] में परिणाम 5।)
  • चरण 6 के बाद ( O):[5,9,8,7,7,2]
  • आउटपुट / चरण 7 के बाद ( à):9

1
मेरे पास 13 केнgLœε‚øε लिए è] OZ` था ।
एमिग्ना

@Emigna धन्यवाद! यह आश्चर्यजनक रूप से मेरे द्वारा देखे गए समान है, सिवाय इसके कि मैंने बकवास का एक गुच्छा जोड़ा जो अनावश्यक था। ; पी
केविन क्रूज़सेन



0

05AB1E , 7 बाइट्स

øœ€Å\Oà

का बंदरगाह @ ais523 जेली सीडब्ल्यू का जवाब है , इसलिए इसे भी सुनिश्चित करें!

इसे ऑनलाइन आज़माएं या सभी परीक्षण मामलों को सत्यापित करें

स्पष्टीकरण:

ø          # Transpose the (implicit) input; swapping row/columns
 œ         # Get all permutations
  ہ\      # Take the main diagonal of each
     O     # Sum each
      à    # Pop and push the maximum (which is output implicitly)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.