2D विभाजन संचयी योग


16

चुनौती

R पंक्तियों और c कॉलम वाले मैट्रिक्स M को देखते हुए , और दो Boolean सूचियों V की लंबाई r और H की लंबाई c , विभाजित संचयी ऊर्ध्वाधर और क्षैतिज योगों की गणना करते हैं।

नियम

  • r और c एक से अधिक या बराबर हैं

  • एच और वी एक सच्चे मूल्य के साथ शुरू होते हैं

  • एम में मूल्य आपकी भाषा के उचित संख्यात्मक डोमेन के भीतर हैं।

  • विभाजन और योग शीर्ष बाएँ कोने में शुरू होता है।

के माध्यम से चलो

दिए गए एम :

┌──────────────┐
│ 1  2  3  4  5│
│ 6  7  8  9 10│
│11 12 13 14 15│
│16 17 18 19 20│
└──────────────┘

एच :1 0 1 0 0

V :1 1 0 1

स्तंभों के समूहों में M को विभाजित करें , हर सही मूल्य पर एक नया समूह शुरू करें H के

┌─────┬────────┐
│ 1  2│ 3  4  5│
│ 6  7│ 8  9 10│
│11 12│13 14 15│
│16 17│18 19 20│
└─────┴────────┘

प्रत्येक समूह को पंक्तियों के समूहों में विभाजित करें, वी के हर सही मूल्य पर एक नया समूह शुरू करें :

┌─────┬────────┐
│ 1  2│ 3  4  5│
├─────┼────────┤
│ 6  7│ 8  9 10│
│11 12│13 14 15│
├─────┼────────┤
│16 17│18 19 20│
└─────┴────────┘

प्रत्येक कक्ष को क्षैतिज रूप से संचयी रूप से:

┌─────┬────────┐
│ 1  3│ 3  7 12│
├─────┼────────┤
│ 6 13│ 8 17 27│
│11 23│13 27 42│
├─────┼────────┤
│16 33│18 37 57│
└─────┴────────┘

प्रत्येक कक्ष को लंबवत रूप से योग करें:

┌─────┬────────┐
│ 1  3│ 3  7 12│
├─────┼────────┤
│ 6 13│ 8 17 27│
│17 36│21 44 69│
├─────┼────────┤
│16 33│18 37 57│
└─────┴────────┘

परिणाम:

┌──────────────┐
│ 1  3  3  7 12│
│ 6 13  8 17 27│
│17 36 21 44 69│
│16 33 18 37 57│
└──────────────┘

अतिरिक्त परीक्षण के मामले

एम :

┌───────────┐
│15 11 11 17│
│13 20 18  8│
└───────────┘

एच : 1 0 0 1वी :1 0

परिणाम:

┌───────────┐
│15 26 37 17│
│28 59 88 25│
└───────────┘

एम :

┌─┐
│7│
└─┘

परिणाम ( एच और वी होना चाहिए 1):

┌─┐
│7│
└─┘

एम :

┌──┐
│ 3│
│-1│
│ 4│
└──┘

वी : 1 1 0( एच होना चाहिए1 )

परिणाम:

┌──┐
│ 3│
│-1│
│ 3│
└──┘

एम :

┌───────────────────────────────────────────────────────┐
│10    7.7 1.9 1.5 5.4  1.2 7.8 0.6 4.3 1.2  4.5 5.4 0.3│
│ 2.3  3.8 4.1 4.5 1    7.7 3   3.4 6.9 5.8  9.5 1.3 7.5│
│ 9.1  3.7 7.2 9.8 3.9 10   7.6 9.6 7.3 6.2  3.3 9.2 9.4│
│ 4.3  4.9 7.6 2   1.4  5.8 8.1 2.4 1.1 2.3  7.3 3.6 6  │
│ 9.3 10   5.8 9.6 5.7  8.1 2.1 3.9 4   1.3  6.3 3.1 9  │
│ 6.6  1.4 0.5 6.5 4.6  2.1 7.5 4.3 9   7.2  2.8 3.6 4.6│
│ 1.7  9.9 2.4 4.5 1.3  2.6 6.4 7.8 6.2 3.2 10   5.2 8.9│
│ 9.9  5.3 4.5 6.3 1.4  3.1 2.3 7.9 7.8 7.9  9.6 4   5.8│
└───────────────────────────────────────────────────────┘

एच :1 0 0 1 0 1 1 1 0 1 1 1 0

वी :1 0 0 0 0 1 0 0

परिणाम:

┌────────────────────────────────────────────────────────────────┐
│10   17.7 19.6  1.5  6.9  1.2  7.8  0.6  4.9  1.2  4.5  5.4  5.7│
│12.3 23.8 29.8  6   12.4  8.9 10.8  4   15.2  7   14    6.7 14.5│
│21.4 36.6 49.8 15.8 26.1 18.9 18.4 13.6 32.1 13.2 17.3 15.9 33.1│
│25.7 45.8 66.6 17.8 29.5 24.7 26.5 16   35.6 15.5 24.6 19.5 42.7│
│35   65.1 91.7 27.4 44.8 32.8 28.6 19.9 43.5 16.8 30.9 22.6 54.8│
│ 6.6  8    8.5  6.5 11.1  2.1  7.5  4.3 13.3  7.2  2.8  3.6  8.2│
│ 8.3 19.6 22.5 11   16.9  4.7 13.9 12.1 27.3 10.4 12.8  8.8 22.3│
│18.2 34.8 42.2 17.3 24.6  7.8 16.2 20   43   18.3 22.4 12.8 32.1│
└────────────────────────────────────────────────────────────────┘

जवाबों:


9

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

Zœṗ@+\€Ẏð/

इसे ऑनलाइन आज़माएं! और अंतिम टेस्ट केस ( Gपठनीयता के लिए अंत में)।

इनपुट को एक सूची के रूप में लिया जाता है [M, H, V]

व्याख्या

Zœṗ@+\€Ẏð/  Input: [M, H, V]
        ð/  Insert the previous (f) as a dyadic link
            Forms f( f(M, H) , V)
            For f(x, y):
Z             Transpose x
 œṗ@          Partition the rows of x^T at each true in y
    +\€       Compute the cumulative sums in each partition
       Ẏ      Tighten (Joins all the lists at the next depth)

आप इस तरह से पाद लेख का उपयोग कर सकते हैं ताकि आपको अपने वास्तविक कोड के साथ छेड़छाड़ न करनी पड़े।
निकोल आउटफेलर जूल

7

एपीएल (डायलॉग) , 13 बाइट्स

तर्क के रूप में वीएचएम के आईएसटी लेता है।

{⍉⊃,/+\¨⍺⊂⍵}/

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

{}/ निम्नलिखित अनाम फ़ंक्शन सम्मिलित करें (कम करें), जहां बाईं ओर शब्द the द्वारा दर्शाया गया है और दाईं ओर शब्द) द्वारा दर्शाया गया है। एपीएल फ़ंक्शन सही सहयोगी होने के कारण, यह इसलिए वी एफ ( एच एफ एम ) है।

⍺⊂⍵ विभाजन partition ⍺ के अनुसार

+\¨ प्रत्येक भाग का संचयी योग

,/ संगति से कम (यह रैंक कम करने के लिए परिणाम संलग्न करता है)

 खुलासा

 पक्षांतरित


6

पायथन 2 + सुन्न, 143 138 117 115 110 108 बाइट्स

-21 बाइट्स Adám को धन्यवाद !

lambda M,*L:reduce(lambda m,l:vstack(map(lambda p:cumsum(p,0),split(m,*where(l)))).T,L,M)
from numpy import*

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


1
विभाजन के लिए पूछें, विभाजन, और एक बार सहानुभूति, स्थानांतरण, दोहराना।
Adám

@ एडम धन्यवाद, मैंने किसी कारण से ऐसा नहीं सोचा था।
नॉटजागन

मुझे वैसे भी दो कार्यों की सूची देखना पसंद था :)
जोनाथन एलन

2
कृपया हेडर "पायथन 3 + सुन्न" बनाएं
लीक

5

जेली ,  15  14 बाइट्स

œṗ+\€Ẏ
ḢçЀZð⁺

H,Vबाईं Mओर दाईं ओर एक डायैडिक लिंक और परिणामी मैट्रिक्स वापस।

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

वैकल्पिक रूप से 14 के लिए भी एक पंक्ति के रूप में: Ḣœṗ+\€Ẏ$¥Ð€Zð⁺

कैसे?

œṗ+\€Ẏ - Link 1: partition and cumSum: list of partition bools, list of values
œṗ     - partition (the values) at truthy indexes (of the bools)
    €  - for €ach part:
  +\   -   cumulative reduce by addition
     Ẏ - tighten (flattens back into a list)

ḢçЀZð⁺ - Main link: list of lists, [H,V]; list of lists, M
      ⁺ - perform this twice:
     ð  - [it's a dyadic chain for the second pass, first pass is dyadic implicitly]
Ḣ       -   head, pop it & modify (so H the first time, V the second)
  Ѐ    -   map across right: (M the first time, the intermediate result the second)
 ç      -     the last link (1) as a dyad
    Z   -   transpose the result (do the rows first time, and the columns the second)

पिछला:

œṗ@+\€Ẏ
ç€Zç€⁵Z

एक पूर्ण कार्यक्रम परिणाम का प्रतिनिधित्व मुद्रण।


जो -50% पिछले जेली उत्तर से!
Adám

वो क्या? वाह। मुझे वास्तव में यह अध्ययन करने की आवश्यकता है कि आपने यह कैसे किया ... मेरी तुलना में अविश्वसनीय!
HyperNeutrino

ओह, यह दोनों दिशाओं को अलग-अलग कर रहा है, है ना? होशियार।
HyperNeutrino

मुझे लगता है कि यह लगभग एक ही काम कर रहा है ...
जोनाथन एलन

अच्छी विधि। इसका मतलब है कि मैं इसे एपीएल के साथ हरा सकता हूं। मुझे 14 बाइट्स मिली हैं।
Adám

4

MATL , 19 बाइट्स

,!ix"0GYs@12XQ!g]v!

इनपुट्स M(मैट्रिक्स), H(कॉलम वेक्टर), V(कॉलम वेक्टर) हैं। पंक्ति विभाजक है ;

इसे ऑनलाइन आज़माएं! या सभी परीक्षण मामलों को सत्यापित करें: 1 , 2 , 3 , 4 , 5

व्याख्या

यह संचयी योग क्षैतिज रूप से करता है, फिर लंबवत होता है।

,          % Do the following twice
  !        %   First time this inputs M implicitly. Transpose. Second time
           %   it transposes the result of the horizontal cumulative sum
  ix       %   Input H (first time) or V (second time). Delete it; but gets
           %   copied into clipboard G
  "        %   For each column of the matrix
    0G     %     Push most recent input: H (first time) or V (second)
    Ys     %     Cumulative sum. This produces a vector of integer values
           %     such that all columns (first time) or rows (second) of M 
           %     with the same value in this vector should be cumulatively
           %     summed
    @      %     Push current column of M transposed (first time) or M after
           %     horizontal cumulative sum (second time)
    12XQ   %     Cumulative sum. Gives a cell array of row vectors
    !g     %     Join those vectors into one row vector
  ]        %   End
  v        %   Concatenate the row vectors vertically into a matrix
  !        %   Transpose. This corrects for the fact that each column vector
           %   of the matrix was cumulatively summed into a row vector
           % Implicit end. Implicit display

1
सबसे ज्यादा प्रभावशाली। मुझे लगता है कि मतलाब थोड़े सामान के लिए बनाया गया था।
Adám

@ मुझे यकीन है कि एपीएल की लंबाई बहुत अलग नहीं होगी :-)
लुइस मेंडो

परीक्षण के मामलों को उत्पन्न करने के लिए उपयोग किया जाने वाला मेरा संदर्भ कार्यान्वयन 26 बाइट्स है।
Adám

@ एडम डेरन! एपीएल जेली की पिटाई? यह अस्वीकार्य है! (मेरे समाधान गोल्फ चाहिए ... lol) xD
हाइपरएन्यूट्रीनो

@HyperNeutrino खैर, जेली में एपीएल और जे जैसी रैंक और गहराई दोनों नहीं हैं।
Adám

3

जे , 20 बाइट्स

;@(<@(+/\);.1|:)&.>/

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

इनपुट युक्त बॉक्स की एक सरणी के रूप में लिया जाता है [V, H, M]

व्याख्या

;@(<@(+/\);.1|:)&.>/  Input: [V H M]
  (     g      )   /  Insert g and reduce (right-to-left)
                      Forms V g H g M = V g (H g M)
                & >     Unbox each
             |:         Transpose the right arg
          ;.1           Partition
      +/\               Reduce each prefix using addition (cumulative sum)
   <@                   Box each partition
;@                      Raze (Concatenate the contents in each box)
                &.>     Box the result

2

गणितज्ञ, 212 बाइट्स

(T=Transpose;A=AppendTo;J=Flatten;f[s_]:=Block[{},t=2;r=1;w={};While[t<=Length@s,If[s[[t]]==0,r++,w~A~r;r=1];t++];w~A~r];K[x_,y_]:=Accumulate/@#&/@(FoldPairList[TakeDrop,#,f@y]&/@x);d=J/@K[#,#2];T[J/@K[T@d,#3]])&


इनपुट
[एम, एच, वी]

[{{१५, ११, ११, १,}, {१३, २०, १ 11,,}}, {१, ०, ०, १}, {१, ०}]


2

C # (.NET Core) , 164 बाइट्स

(M,H,V)=>{int a=M.Length,b=M[0].Length,i,j;for(i=0;i<a;i++)for(j=0;j<b;j++)if(!H[j])M[i][j]+=M[i][j-1];for(i=0;i<a;i++)for(j=0;j<b;j++)if(!V[i])M[i][j]+=M[i-1][j];}

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

मूल रूप से यह ओपी में निर्दिष्ट के रूप में करता है। यह पहले क्षैतिज रूप से योग करने के लिए पुनरावृत्त करता है और फिर इसे लंबवत रूप से योग करने के लिए पुन: प्रसारित करता है।


2

हास्केल , 129 बाइट्स 119 बाइट्स

s m v=tail$scanl(\a(x,s)->if s then x else zipWith(+)a x)[](zip m v)
t=foldr(zipWith(:))$repeat[]
f m h v=t$s(t$s m v)h

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

@Ceasedtoturncounterclockwis की बदौलत 10 बाइट्स बचाए

t(स्थानान्तरण के लिए) पंक्तियों और स्तंभों को स्विच करता है। एक त्वरित स्पष्टीकरण:

foldr(zipWith(:))(repeat[])(r1,...,rn) =
zipWith(:) r1 (zipWith(:) r2 (... zipWith(:) rn (repeat [])))

दाईं से बाईं ओर पढ़ें: हम पंक्तियों को नीचे से ऊपर तक ब्राउज़ करते हैं, और प्रत्येक मान को उसके गंतव्य कॉलम में धकेलते हैं।

s मूल रूप से वैक्टर का एक रोलिंग योग है, लेकिन जब एक सच्चा मूल्य उत्पन्न होता है तो रीसेट करता है v

fsनिम्नलिखित पंक्तियों के साथ पंक्तियाँ लिखें vऔर निम्नलिखित स्तंभों के साथ भी ऐसा ही करेंh


t=foldr(zipWith(:))(repeat[])। न केवल कम, बल्कि बहुत कम अकुशल।
को बंद करना बंद कर दिया

@ceasedtoturncounterclockwis टिप के लिए धन्यवाद।
जुल्फ

1

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

(a,h,v)=>a.map(b=>b.map((e,i)=>t=h[i]?e:t+e)).map((b,j)=>t=v[j]?b:t.map((e,i)=>e+b[i]))

0

जेली , 31 बाइट्स

+\€€
œṗḊZ€⁵œṗ$€Ḋ€Ç€ÇZ€€Z€;/€€;/

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

यह जेली एक्सडी के लिए बहुत लंबा रास्ता है

इस कार्यक्रम में BTW, 11/31 बाइट्स में यूरो वर्ण होते हैं। यह कार्यक्रम का एक तिहाई से अधिक है!


बहुत सारे यूरो।
Adám

@ मेरे विचार बिल्कुल: P दोहरे रूप से विभाजित मैट्रिस के साथ काम करना उतना मजेदार नहीं है जितना मैंने सोचा था कि यह होगा, क्योंकि मैं दूसरे स्तर के तीसरे स्तर के मैपिंग xD कर रहा हूं
HyperNeutrino

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