आकृति को संरक्षित करते हुए रिवर्स कॉलम


20

परिचय

मान लीजिए कि आपके पास पूर्णांकों की सूची (या वास्तव में कोई वस्तु है, लेकिन चलो सरलता के लिए पूर्णांक से चिपके रहते हैं)। सूचियां अलग-अलग लंबाई की हो सकती हैं, और उनमें से कुछ खाली हो सकती हैं। आइए सूचियों को एक सारणीबद्ध प्रारूप में लिखें:

[[ 1,   2,   3,   4,   5],
 [ 6,   7],
 [ 8,   9,  10,  11],
 [],
 [12,  13,  14],
 [15,  16,  17,  18]]

इस तालिका में, 5 ऊर्ध्वाधर कॉलम संख्या से युक्त 1, 6, 8, 12, 15, 2, 7, 9, 13, 16, 3, 10, 14, 17, 4, 11, 18, और 5। यदि हम प्रत्येक स्तंभ रिवर्स, हम सूचियों प्राप्त 15, 12, 8, 6, 1, 16, 13, 9, 7, 2, 17, 14, 10, 3, 18, 11, 4, और 5। आइए पंक्तियों की लंबाई को पहले की तरह रखते हुए उन संख्याओं को वापस तालिका के कॉलम में प्लग करें:

[[15,  16,  17,  18,   5],
 [12,  13],
 [ 8,   9,  14,  11],
 [],
 [ 6,   7,  10],
 [ 1,   2,   3,   4]]

आपका कार्य इस ऑपरेशन को लागू करना है।

इनपुट और आउटपुट

आपका इनपुट पंक्तियों का प्रतिनिधित्व करते हुए, गैर-सूचकांकों की सूची की एक सूची है। पंक्तियों की लंबाई अलग हो सकती है, और उनमें से कुछ खाली हो सकती हैं। हमेशा कम से कम एक पंक्ति होगी। आपका आउटपुट प्रत्येक कॉलम को उलटने का परिणाम है, जैसा कि ऊपर विस्तृत है। इनपुट और आउटपुट किसी भी उचित प्रारूप में हो सकते हैं।

प्रत्येक भाषा में सबसे कम बाइट गिनती जीतती है। मानक नियम लागू होते हैं।

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

[[]] -> [[]]
[[],[]] -> [[],[]]
[[8,5,1]] -> [[8,5,1]]
[[1,200],[0,3]] -> [[0,3],[1,200]]
[[],[3,9],[1],[]] -> [[],[1,9],[3],[]]
[[],[5,8,7],[0,6,5,7,1]] -> [[],[0,6,5],[5,8,7,7,1]]
[[1,8,5],[7,5,4],[],[1]] -> [[1,5,4],[7,8,5],[],[1]]
[[],[],[2],[],[31],[],[5],[],[],[],[7]] -> [[],[],[7],[],[5],[],[31],[],[],[],[2]]
[[1,10,100,1000],[2,20,200],[3,30],[4],[5,50,500],[6,60],[7]] -> [[7,60,500,1000],[6,50,200],[5,30],[4],[3,20,100],[2,10],[1]]
[[8,4],[3,0,4,8,1],[8],[0,8],[9,7,1,6],[3,8,1,9,5]] -> [[3,8],[9,7,1,9,5],[0],[8,8],[3,0,1,6],[8,4,4,8,1]]
[[3,9,3],[5],[1],[3,5],[9,0,6,2],[1,3],[4,9,2],[6,6,7,8,7]] -> [[6,6,7],[4],[1],[9,9],[3,3,2,8],[1,0],[5,5,6],[3,9,3,2,7]]
[[8,5,6],[3,5,2,4,9],[4,3,8,3,7],[6,1,1],[1,8,9,9],[9,1,2],[8,7]] -> [[8,7,2],[9,1,9,9,7],[1,8,1,3,9],[6,1,8],[4,3,2,4],[3,5,6],[8,5]]
[[2,4],[1,4],[0,8,7,3],[4,9,2,5],[2,8,0],[0,8,3],[7,3,1],[],[3,3,7,8]] -> [[3,3],[7,3],[0,8,7,8],[2,8,1,5],[4,9,3],[0,8,0],[1,4,2],[],[2,4,7,3]]

1
क्या हम आउटपुट की पंक्तियों को नल के साथ पैड कर सकते हैं? (जैसे [[1,9],[3],[2,4,5]] -> [[2,4],[3,null],[1,9,5]])
ETHproductions

@ETHproductions नहीं, आउटपुट में केवल संख्याएँ होनी चाहिए।
जर्गर्ब

-1 क्योंकि यह सामान्य नहीं है (पंक्ति तत्व के रूप में नकारात्मक संख्या, अक्षर, स्ट्रिंग और सभी संभव प्रकार की अनुमति नहीं है) + मुझे यह पसंद नहीं है (यह अनावश्यक मुश्किल लगता है)
RosLuP

जवाबों:


5

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

ḟṚṁṣj
z-ç€-ZFḟ-ṁ

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

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

z-ç€-ZFḟ-ṁ  Main link. Argument: M (matrix / 2D array)

z-          Zip the rows of M, using -1 as filler.
  ç€-       Map the helper link over the result, with right argument -1.
     Z      Zip the rows of the result.
      F     Flatten the resulting matrix.
       ḟ-   Filterfalse -1; remove all occurrences of -1.
         ṁ  Mold; shape the result like M.


ḟṚṁṣj       Helper link.
            Left argument: A (row / 1D array). Right argument: -1

ḟ           Filterfalse; remove all occurrences of -1.
 Ṛ          Reverse the resulting vector.
   ṣ        Split A at occurrences of -1.
  ṁ         Mold; shape the vector to the left like the 2D array to the right.
    j       Join the resulting 2D array, separating by -1.

अच्छा, शीर्ष पंक्ति पर बहुत चालाक है! ( सही ḟṚṁṣjकरता ⁸ḟ⁹Ṛṁ⁸ṣ⁹¤j⁹है?) अन्यथा मेरे पास एक और बाइट के लिए यह था
एरिक आउटगॉल्फर

हां, ठीक यही है।
डेनिस

4

जाप , 15 13 बाइट्स

@ बस्ती के लिए 2 बाइट्स धन्यवाद बचाया

y@=XfÊX£o
®fÄ

इसे ऑनलाइन टेस्ट करें!

दूसरी पंक्ति को हटाया जा सकता है यदि हमें 4 मानों की बचत के साथ अशक्त मानों के साथ पंक्तियों को पैड करने की अनुमति है।

व्याख्या

 y@  =XfÊ X£  o      Implicit: U = input array
UyX{U=Xfl Xm{Uo}}    (Ungolfed)
UyX{            }    Map each column X in the input by this function:
    U=Xfl              Set U to X filtered to only items whose factorial is truthy;
                       this just gets rid of the empty slots in the column.
          Xm{  }       Map each item in X to
             Uo          the last item in U, popping this item from the list.
                       Due to the way .map works in JS, this is only called on real items
                       and not empty slots, so this preserves empty slots.
                     Newline: set U to the resulting column-reversed array
 ®   fÄ              Due to the way y works, there will now be `undefined` in some rows.
UmZ{Zf+1}            (Ungolfed)
 mZ{    }            Map each row Z in U to
    Zf+1               Z filtered to only items where the item + 1 is truthy.
                     undefined + 1 is NaN, which is falsy, and thus eliminated.
                     Implicit: output result of last expression

अच्छा है! आप इसे 13 बाइट्स केl; साथ Êऔर उसके mf_Äसाथ बदलकर नीचे प्राप्त कर सकते हैं ®fÄ
झबरा

वास्तव में, बस mfदूसरी पंक्ति के लिए काम करने लगता है।
झबरा

@ शैगी धन्यवाद, उन लोगों के बारे में सोचा नहीं था! mfपरिणाम में किसी भी शून्य से छुटकारा मिलेगा, दुर्भाग्य से ...
ETHproductions

आह, हाँ, यह नहीं सोच रहा था।
झबरा

4

एपीएल (डायलॉग यूनिकोड) , 20 19 16 बाइट्स एसबीसीएस

-4 ngn के लिए धन्यवाद।

पूरा कार्यक्रम। STDIN से इनपुट के लिए संकेत

0~¨⍨↓⍉⌽@×⍤1⍉↑*⎕

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

उदाहरण के साथ स्पष्टीकरण के माध्यम से चलना

 मूल्यांकन किए गए इनपुट के लिए संकेत
[[1,8,5],[7,5,4],[],[1]]

*उस की शक्ति के  लिए उठाएँ ( n जो सुनिश्चित करता है कि कोई शून्य नहीं होगा)
[[2.7,2981,148.4],[1096.6,148.4,54.6],[],[2.7]]

 एक मैट्रिक्स में सूचियों को मिलाएं, शून्य के साथ पैडिंग:
┌ ┐
│2.7E0 3.0E3 1.5E2│
│1.1E3 1.5E2 5.5E1│
│0.0E0 0.0E0 0.0E0│
│2.7E0 0.0E0 0.0E0│
└ ┘

 पक्षांतरित
┌ ┐
│2.7E0 1.1E3 0.0E0 2.7E0│
│3.0E3 1.5E2 0.0E0 0.0E0│
│1.5E2 5.5E1 0.0E0 0.0E0│
└ ┘

⌽@×⍤1 प्रत्येक पंक्ति के सकारात्मक तत्वों को उल्टा करें
┌ ┐
│2.7E0 1.1E3 0.0E0 2.7E0│
│1.5E2 3.0E3 0.0E0 0.0E0│
│5.5E1 1.5E2 0.0E0 0.0E0│
└ ┘

 पक्षांतरित
┌ ┐
│2.7E0 1.5E2 5.5E1│
│1.1E3 3.0E3 1.5E2│
│0.0E0 0.0E0 0.0E0│
│2.7E0 0.0E0 0.0E0│
└ ┘

 मैट्रिक्स को सूचियों की सूची में विभाजित करें
[[2.7,148.4,54.6],[1096.6,2981,148.4],[0,0,0],[2.7,0,0]]

0~¨⍨ प्रत्येक सूची से शून्य हटाएं
[[2.7,148.4,54.6],[1096.6,2981,148.4],[],[2.7]]

 प्राकृतिक
[[1,5,4],[7,8,5],[],[1]]


क्या होगा अगर इनपुट -1 हो?
ngn

@ng इनपुट में कभी भी ऋणात्मक संख्याएँ नहीं होंगी; "इनपुट और आउटपुट" अनुभाग देखें।
जर्गब

@Zgarb यह एकदम सही है, धन्यवाद।
ngn

@ Adám मैंने मिक्स-प्रत्येक-स्प्लिट के बजाय रैंक 1 का उपयोग करने के लिए संपादित किया।
ngn

@ Adám यह भी: exp / log of + 1 / -1 के बजाय ←fr 87 1287
ngn

3

K4 , 36 बाइट्स

समाधान:

+{x[w]:|x w:&~^x;x}'x'[::;]@!|/#:'x:

उदाहरण:

q)k)+{x[w]:|x w:&~^x;x}'x'[::;]@!|/#:'x:(1 2 3 4 5;6 7;8 9 10 11;0#0N;12 13 14;15 16 17 18)
15 16 17 18 5
12 13        
8  9  14 11  

6  7  10     
1  2  3  4

q)k)+{x[w]:|x w:&~^x;x}'x'[::;]@!|/#:'x:(0#0N;5 8 7; 0 6 5 7 1)

0 6 5    
5 8 7 7 1

स्पष्टीकरण:

यह एक दर्द रहा है, और मैं अभी भी एल्डर इंडेक्सिंग को सरल बनाने के लिए काम कर रहा हूं।

उदाहरण के लिए, अनुक्रमणिका के बजाय, x[0]जो पहली पंक्ति लौटाएगा , हम पहला स्तंभ लेना चाहते हैं , जिसका उपयोग करके किया जा सकता है x[;0]

हालांकि परिवर्तनशील चर इसे वहाँ में shoving नहीं कर के रूप yमें x[;]व्यवहार करता है :।x[y]x[;y]::x[::;]

यह सूचियों की फ़्लिपिंग के बराबर है, लेकिन फ़्लिप के लिए सभी सूचियों की लंबाई समान होनी चाहिए!

+{x[w]:|x w:&~^x;x}'x'[::;]@!|/#:'x: / the solution
                                  x: / save input as variable x
                               #:'   / count (#:) each (') 
                             |/      / take the max of these lengths
                            !        / til, range 0..max-1
                           @         / apply (index into)
                      [::;]          / :: is a kind of null, 
                    x'               / index into x at each of these    
 {              ; }'                 / two statement lambda on each (')
              ^x                     / null x (returns true if entry is null)
             ~                       / not, so flip true/false
            &                        / where, indexes where true
          w:                         / save as variable w  
        x                            / index into w at these indexes
       |                             / reverse
  x[w]:                              / store this back in variable x at indexes w
                 x                   / return x from function
+                                    / flip the result

3

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

f x=map g.h.map(g.reverse>>=(!)).h$take(maximum$length<$>x).(++z).map pure<$>x
g=concat
h x|g x==[]=x|4>2=foldr(zipWith(:))z x
x!(c:d)|c==[]=c:x!d|a:b<-x=[a]:b!d
_!y=y
z=[]:z

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

Ungolfed / स्पष्टीकरण

विचार सभी तत्वों को लपेटने []और पंक्तियों को पैड करने का है [](एक नकारात्मक पूर्णांक के साथ पैडिंग की तुलना में छोटा होता है, इससे नकारात्मक इनपुट के साथ-साथ जो अच्छा है) की अनुमति देता है, फिर सभी पंक्तियों को उल्टा करें और फिर से स्थानांतरित करें और प्रत्येक पंक्ति को समतल करें। :

map concat                                   -- flatten each row
  . transpose'                               -- transpose (*)
  . map (\row-> reverse (concat row) ! row)  -- reverse each row (see below)
  . transpose'                               -- tranpose (*)
  $ take (maximum $ length <$> x)            -- only keep up as many as longest row
      . (++ z)                               -- pad row with [],[],..
      . map (\e-> [e])                       -- wrap elements in []
 <$> x

* यह ट्रांसपोज़ फंक्शन ( h) बस लिस्ट वापस करता है अगर कोई एलिमेंट नहीं हैं।

रिवर्स फ़ंक्शन को []तत्वों को अनदेखा करना पड़ता है (जैसे। [[],[1],[],[3],[4]]-> [[],[4],[],[3],[1]]), यह दो तर्कों को प्राप्त करके ऐसा करता है: पहला एक रिवर्स ऑर्डर में तत्व हैं (जैसे। [4,3,1]) और दूसरा एक मूल पंक्ति।

x@(a:b) ! (c:d)
 | c == []   = c:x ! d    -- if current element is []: skip it
 | otherwise = [a]:b ! d  -- else: replace with new one (a) and continue
_ ! y = y                 -- base case (if no new elements are left): done


2

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

(a,d=[],g=s=>a.map(b=>b.map((c,i)=>(d[i]=d[i]||[])[s](c))))=>g`push`&&g`pop`

संपादित करें: सहेजे गए 3 बाइट्स @ETHproductions के लिए धन्यवाद।


@ETHproductions अधिकार; मुझे नहीं पता कि मुझे लगा कि यह नहीं होगा, अन्यथा मैंने ऐसा पहले ही कर लिया होता।
नील

1

एपीएल (Dyalog यूनिकोड) , 27 बाइट्स SBCS

≢¨⍴¨∘↓∘⍉⍉∘↑{⍵\⌽⍵/⍺}⍤1∘⍉∘↑=⍨

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


मुझे लगता है कि आपने इस पर काबू पा लिया।
आदम

मुझे पता था कि मैं उपयोग कर सकता हूं @लेकिन मेरे पास नहीं है।
ngn

0

क्लोजर, 123 बाइट्स

#(map(fn[i R](map(fn[j _](let[V(for[Q %](get Q j))F filter](nth(reverse(F + V))(count(F +(take i V))))))(range)R))(range)%)

मैं (+ nil)एक अपवाद को फेंकने की उम्मीद कर रहा था , लेकिन यह मूल्यांकन करता है nil: ओ

यह बिना गद्दी के काम करता है, इसके बजाय यह गिनता है कि पिछली पंक्तियों में से कितनी कम से कम वर्तमान पंक्ति के रूप में लंबी हैं R

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