निर्दिष्ट गैर-संख्यात्मक पंक्तियों को निकालें


16

मामले में कोई संदेह नहीं है: Nan = Non-numeric datatypeइस चुनौती के प्रयोजनों के लिए।


एक प्रोग्राम या फ़ंक्शन लिखें जो इनपुट के रूप में एक मैट्रिक्स / सरणी लेता है, साथ ही स्तंभ सूचकांकों की एक सूची भी।

चुनौती उन पंक्तियों को हटाने की है जहां निर्दिष्ट कॉलम में सभी तत्व हैं Nan। इससे कोई फर्क नहीं पड़ता कि पंक्ति में अन्य तत्व संख्यात्मक हैं या नहीं। निम्नलिखित उदाहरण उम्मीद है कि यह और अधिक स्पष्ट कर देगा (यह एक-अनुक्रमित है):

Input array:
    16   NaN     3    13
     5    11   NaN     8
   NaN     7   NaN    12
     4    14   -15     1

Input column index: [1 3]

Output array:
16   NaN     3    13
 5    11   NaN     8
 4    14   -15     1

----

Input array:
    16   NaN     3    13
     5    11   NaN     8
   NaN     7   NaN    12
     4    14   -15     1

Input column index: 3

Output array =
    16   NaN     3    13
     4    14   -15     1

----

Input array:
   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN

Input column index: 1 2 4

Output array:
 []

नियम और स्पष्टीकरण:

  • मैट्रिक्स हमेशा गैर-रिक्त रहेगा
  • संख्यात्मक मान परिमित होंगे, लेकिन आवश्यक नहीं कि पूर्णांक या सकारात्मक मान हों
  • कॉलम इंडेक्स वेक्टर खाली हो सकता है (जिस स्थिति में कोई पंक्तियों को हटाया नहीं जाएगा)
  • कॉलम इंडेक्स में मैट्रिक्स आयामों से अधिक मूल्य कभी नहीं होंगे
  • आप मान सकते हैं कि कॉलम इंडेक्स सूची में डुप्लिकेट नहीं होंगे
  • यदि आप शून्य- या एक-अनुक्रमित मानों का उपयोग करना चाहते हैं, तो कृपया चुन सकते हैं (कृपया निर्दिष्ट करें)
  • आप किसी भी सुविधाजनक प्रारूप पर इनपुट ले सकते हैं
    • सूचियों की सूची के रूप में सरणी ठीक है। स्तंभ सूचक अलग तर्क हो सकते हैं
  • ans = और इसी तरह आउटपुट में स्वीकार किया जाता है
  • आप यह चुनने के लिए स्वतंत्र हैं कि आप किस प्रकार के गैर-संख्यात्मक डेटाटाइप का उपयोग करना चाहते हैं
    • इस डेटाटाइप के साथ अंकगणितीय संचालन करना असंभव है, या इस तरह के कार्यों का उपयोग करके इसे एक परिमित संख्या में परिवर्तित करना चाहिए float(x)

यह कोड गोल्फ है, इसलिए बाइट्स जीतने वाला सबसे छोटा कोड है।

जवाबों:


6

पायथ, 16 19 10 9 7 10 बाइट्स

कॉलम इंडेक्स शून्य से शुरू होता है। इनपुट सूची की एक सूची है। गैर-संख्यात्मक मान के रूप में एक रिक्त स्ट्रिंग का उपयोग करता है। पहली पंक्ति पर स्तंभ सूचक और दूसरी पंक्ति के मूल्यों के साथ मैट्रिक्स की सूची लेता है।

?Qf-QxkTEE

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

व्याख्या

?Qf-QxkTEE       # Implicit: Q=column indices, E=Matrix

?Q       E       # If column list is empty no rows get removed
  f     E        # filter the given matrix by each row T
     xkT         # Get the indices of all occurences of an emtpy string (k) 
   -Q            # If the indices match with the given column indices, remove the row

अद्यतन: मेरे पहले समाधान ने कॉलम सूचकांकों की एक गलत सूची को गलत तरीके से संभाला। 3 बाइट्स की कीमत पर इसे (बहुत बदसूरत) तय किया। काम के बाद बेहतर करने की कोशिश ...

अद्यतन २: १० : बाइट्स में इसे नीचे गिराया , @FryAmTheEggman की मदद से एल्गोरिथ्म में काफी सुधार करके।

Update3: फिक्स्ड एक बग @ThomasKwa की खोज की। उनके प्रस्तावित 7-बाइट समाधान ने खाली कॉलम सूचक को ठीक से संभाल नहीं किया, इसलिए मैं बस उस मामले को यहां एक टर्नरी के साथ पकड़ता हूं। मैं यह नहीं देखता कि मैं इस एटीएम को कैसे छोटा कर सकता हूं।


1
आप के Jसाथ vzऔर Kसाथ बदल सकते हैं Q। मूल्यांकन के zलिए इनपुट के लिए इनिशियलाइज़ Qकिया गया है।
PurkkaKoodari

@ Pietu1998 बहुत बहुत धन्यवाद! :) मुझे पता था कि मैं उस संबंध में कुछ याद कर रहा था। अफसोस की बात है कि मुझे एक बग मिला, जब मैंने आपके सुझाव को लागू करने के लिए इसे फिर से देखा, जो कुल मिलाकर मेरी बाइट गिनती बढ़ाता है जब तक कि मैं एक अच्छा समाधान नहीं ढूंढता।
डेन्कर

1
?KEfnmklKm@TdKQQखाली सूचियाँ पाइथ में मिथ्या हैं, और असाइनमेंट स्टेटमेंट में दिए गए मान को लौटाते हैं, जो कुछ बाइट्स को बचाता है। मुझे आशा है कि आप गोल्फ पर्थ का आनंद लेंगे! :)
FryAmTheEggman

@FryAmTheEggman सुझाव के लिए धन्यवाद। अब वास्तव में प्रासंगिक नहीं है क्योंकि मैंने एल्गोरिथ्म में बहुत सुधार किया है, लेकिन मैं वास्तव में मदद की सराहना करता हूं! :)
डेन्कर

बहुत अच्छा :) आप Lfnks@LTQE
FryAmTheEggman

6

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

(a,l)=>a.filter(r=>l.some(c=>r[a=0,c]<1/0)||a)

व्याख्या

सरणियों के रूप में पंक्तियों की एक सरणी और स्तंभों की जाँच के लिए 0-अनुक्रमित संख्याओं की एक सरणी की अपेक्षा करता है। सरणियों की एक सरणी देता है।

सीधे-आगे filterऔर some। के लिए चेक NaNका उपयोग करके n < Infinity( trueके लिए सीमित संख्या, falseके लिए NaNरों)।

var solution =

(a,l)=>
  a.filter(r=>     // for each row r
    l.some(c=>     // for each column to check c
      r[a=0,       // set a to false so we know the some was executed
        c]<1/0     // if any are not NaN, do not remove the row
    )
    ||a            // default to a because if l is of length 0, some returns false but
  )                //     we must return true
<textarea id="matrix" rows="5" cols="40">16 NaN 3 13
5 11 NaN 8
NaN 7 NaN 12
4 14 -15 1</textarea><br />
<input type="text" id="columns" value="0 2" />
<button onclick="result.textContent=solution(matrix.value.split('\n').map(l=>l.split(' ').map(n=>+n)),(columns.value.match(/\d+/g)||[]).map(n=>+n)).join('\n')">Go</button>
<pre id="result"></pre>


उस किनारे के मामले को अच्छी तरह से संभालना!
नील

3

सीजाम, 18 बाइट्स

{{1$\f=_!\se|},\;}

एक अनाम ब्लॉक (फ़ंक्शन) जो मैट्रिक्स और शून्य-आधारित स्तंभ सूचकांकों के स्टैक (शीर्ष पर मैट्रिक्स) की अपेक्षा करता है, जो स्टैक पर फ़िल्टर किए गए मैट्रिक्स को छोड़ देता है। मैं ""गैर-संख्यात्मक मान के रूप में खाली सरणी का उपयोग कर रहा हूं ।

इसका परीक्षण यहां करें।

व्याख्या

{     e# Filter the matrix rows based on the result of this block...
  1$  e#   Copy the column indices.
  \f= e#   Map them to the corresponding cell in the current row.
  _!  e#   Duplicate, logical NOT. Gives 1 for empty column list, 0 otherwise.
  \s  e#   Convert other copy to string. If the array contained only empty arrays, this 
      e#   will be an empty string which is falsy. Otherwise it will contain the numbers 
      e#   that were left after filtering, so it's non-empty and truthy.
  e|  e#   Logical OR.
},
\;    e# Discard the column indices.

क्या मैं इसे गलत परीक्षण कर रहा हूं या क्या यह किसी दिए गए कॉलम सूचकांकों के बारे में नियम का उल्लंघन करता है? The column index vector can be empty (in which case no rows will be removed)
Denker

@ डेंकरएफ़ डेमन, 5 बाइट की कीमत तय ...
मार्टिन एंडर

मैं वहां भी था ... तुम अब भी मेरे आगे एक बाइट कर रहे हो, इसलिए मेरी योजना अभी तक
कारगर

"खाली सरणी """ क्या आपका मतलब "खाली स्ट्रिंग" था?
ETHproductions

@ETHproductions CJam में कोई अंतर नहीं है। स्ट्रिंग्स पात्रों में से सिर्फ सरणियों हैं, इसलिए []और ""समान हैं और विहित प्रतिनिधित्व है ""(उदाहरण के लिए यह आप जब आप एक खाली सरणी stringify क्या मिलता है)।
मार्टिन एंडर

3

एपीएल, 19 बाइट्स

{⍵⌿⍨∨/⍬∘≡¨0↑¨⍵[;⍺]}

बाएं तर्क सूचकांकों की एक सूची होनी चाहिए (और यह एक सूची होनी चाहिए, स्केलर नहीं), सही तर्क मैट्रिक्स है। APL में दो डेटाटिप्स, संख्याएँ और वर्ण होते हैं, इसलिए यह वर्ण प्रकारों को फ़िल्टर करता है।

टेस्ट:

      m1 m2
   16  NaN    3  13   NaN  NaN  NaN  NaN  
    5   11  NaN   8   NaN  NaN  NaN  NaN  
  NaN    7  NaN  12   NaN  NaN  NaN  NaN  
    4   14  ¯15   1   NaN  NaN  NaN  NaN  
      1 3 {⍵⌿⍨∨/⍬∘≡¨0↑¨⍵[;⍺]} m1
16  NaN    3  13
 5   11  NaN   8
 4   14  ¯15   1
      (,3) {⍵⌿⍨∨/⍬∘≡¨0↑¨⍵[;⍺]} m1
16  NaN    3 13
 4   14  ¯15  1
      1 2 4 {⍵⌿⍨∨/⍬∘≡¨0↑¨⍵[;⍺]} m2 ⍝ this shows nothing
      ⍴1 2 4 {⍵⌿⍨∨/⍬∘≡¨0↑¨⍵[;⍺]} m2 ⍝ the nothing is in fact a 0-by-4 matrix
0 4

स्पष्टीकरण:

  • ⍵[;⍺]: मैट्रिक्स से दिए गए कॉलम का चयन करें
  • 0↑¨: 0प्रत्येक आइटम की शुरुआत से पहले तत्व लें
  • ⍬∘≡¨: संख्यात्मक खाली सूची की तुलना करें
  • ∨/: देखें कि किन-किन पंक्तियों में कम से कम एक आइटम मेल खाता है
  • ⍵⌿⍨: मैट्रिक्स से उन पंक्तियों का चयन करें

2

MATLAB, 32 28 बाइट्स

मैं एक बार के लिए अपने प्रश्न का उत्तर दूंगा। MATLAB में सबसे अच्छा मैं कर सकता हूँ 28 बाइट्स। मैं दोनों का उपयोग कर से बचने के लिए उम्मीद कर रही थी allऔर isnanकिसी भी तरह, लेकिन अभी तक एक तरह से नहीं मिली है।

@(A,c)A(any(A(:,c)<inf,2),:)

परीक्षा:

A =
    35     1   NaN   NaN   NaN    24
     3    32   NaN    21    23    25
    31   NaN   NaN   NaN    27    20
   NaN    28   NaN    17   NaN    15
    30     5   NaN    12    14   NaN
     4    36   NaN    13    18    11

f(A,[3,5])
ans =
     3    32   NaN    21    23    25
    31   NaN   NaN   NaN    27    20
    30     5   NaN    12    14   NaN
     4    36   NaN    13    18    11

यह एक अनाम अनाम फ़ंक्शन है जो इनपुट मैट्रिक्स को पहले इनपुट चर के रूप में लेता है, और दूसरे के रूप में स्तंभ सूचकांकों की एक सूची।

MATLAB में, NaN < Infअसत्य का मूल्यांकन करता है। यह माना जा सकता है कि सभी मान परिमित हैं, इस प्रकार जाँचना कि मान कम हैं या नहीं infयह जाँचने के बराबर है यदि वे गैर-संख्यात्मक हैं।any(...,2)जाँचता है कि क्या दूसरे आयाम (पंक्तियों) के साथ कोई वास्तविक मूल्य हैं। अगर ऐसा है, तो उन पंक्तियों को वापस कर दिया जाएगा।

पुराना संस्करण:

@(A,c)A(~all(isnan(A(:,c)),2),:)

isnan(A(:,c)) निर्दिष्ट कॉलम के लिए बूलियन के साथ एक सरणी देता है। ~all(isnan(A(:,c)),2)जाँचता है कि क्या दूसरे आयाम (पंक्तियों) के सभी मान गैर-संख्यात्मक हैं, और इसे नकारते हैं। यह उन बूलियन वेक्टर का परिणाम देता है जिन्हें हम रखना चाहते हैं। A(~all(isnan(A(:,c)),2),:)के लिए संपूर्ण पंक्तियों को निकालने के लिए तार्किक अनुक्रमण का उपयोग करता है A


यदि मान शून्य न होने की गारंटी दी जाए तो निम्नलिखित 24 बाइट समाधान काम करेगा:

@(A,c)A(any(A(:,c),2),:)

2

रूबी, 48 बाइट्स

->a,c{a.select{|r|c.map{|i|Fixnum===r[i]}.any?}}

इनपुट 0-आधारित सूचकांक 1 है

वास्तव में स्व-व्याख्यात्मक, वास्तव में। selectसरणी से तत्व जहां पंक्ति से अधिक any?सूचकांकों के mapपेड हैंFixnum एस हैं।

नमूना रन:

irb(main):010:0> (->a,c{a.select{|r|c.map{|i|Fixnum===r[i]}.any?}})[[[16,'',3,13],[5,11,'',8],['',7,'',12],[4,14,-15,1]],[0,2]]
=> [[16, "", 3, 13], [5, 11, "", 8], [4, 14, -15, 1]]

1: मैंने अंत में पहली कोशिश में इस शब्द को सही ढंग से लिखा! \ o /


2

K5, 15 बाइट्स

यह 0-अनुक्रमित कॉलम और K की प्राकृतिक सूची-सूची मैट्रिक्स प्रतिनिधित्व का उपयोग करता है:

{x@&~&/'^x[;y]}

मैट्रिक्स में सूचकांक ( x@) पंक्तियाँ जहाँ ( &) प्रत्येक की नहीं ( ~&/') शून्य है ( ^)।

कार्रवाई में:

  m: (16 0N 3 13;5 11 0N 8;0N 7 0N 12;4 14 -15 1);
  f: {x@&~&/'^x[;y]};

  f[m;0 2]
(16 0N 3 13
 5 11 0N 8
 4 14 -15 1)

  f[m;2]
(16 0N 3 13
 4 14 -15 1)

2

MATL , 15 16 बाइट्स

tiZ)tn?ZN!XA~Y)

NaNके रूप में इनपुट में प्रतिनिधित्व किया है N। इंडेक्सिंग 1-आधारित है। उदाहरण के लिए, पहले परीक्षण के मामले में इनपुट है

[16 N 3 13; 5 11 N 8; N 7 N 12; 4 14 -15 1]
[1 3]

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

व्याख्या

t       % implicitly input matrix, M. Duplicate
i       % input vector specifying columns
Z)      % matrix N containing those columns of M
tn?     % duplicate matrix N. If non-empty ...
  ZN    %   true for NaN values in matrix N
  !     %   transpose
  XA    %   "all" within each column: gives true for rows of N that contained all NaN's
  ~     %   logical negate
  Y)    %   apply this logical index as a row index into the copy of M that was left
        %   at the bottom of the stack
        % ... implicitly end if
        % implictly display stack contents. If the input vector was empty, the stack
        % contains the original matrix M and an empty matrix. The latter produces no
        % displayed output. If the input vector was non-empty, the stack contains the
        % resulting matrix N

2

आर, 49 बाइट्स

function(m,j)m[!!rowSums(!is.nan(m[,j,drop=F])),]

इनपुट 1-आधारित है। फ़ंक्शन मैट्रिक्स ( m) और स्तंभ सूचकांकों का वेक्टर लेता है (j ) जो गायब हो सकता है।

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

> f <- function(m,j)m[!!rowSums(!is.nan(m[,j,drop=F])),]
> f(m)   
      V1  V2  V3 V4
[1,]  16 NaN   3 13
[2,]   5  11 NaN  8
[3,] NaN   7 NaN 12
[4,]   4  14 -15  1

> f(m, c(1,3))
     V1  V2  V3 V4
[1,] 16 NaN   3 13
[2,]  5  11 NaN  8
[3,]  4  14 -15  1

0

लुआ, 148 बाइट्स

एक फ़ंक्शन जो इनपुट के रूप में एक मैट्रिक्स और एक सरणी लेता है, और इसी पंक्तियों के साथ एक मैट्रिक्स को आउटपुट करता है nil। चूंकि सरणियाँ C के सरणियों के समान ही होती हैं, इसलिए शून्यकरण ऐसा होता है जैसे free()कि कचरा संग्राहक दूर नहीं है।

"NaN"एरुआ लुआ में 1-अनुक्रमित है, और मैं स्ट्रिंग का उपयोग गैर-नामांकित तत्व के रूप में करता हूं।

function f(m,l)c=1 while(c<#m)do x=0 for j=1,#l do x=x+((type(m[c][l[j]])=="number")and 0 or 1)end m[c]=(x<#l and m[c] or nil)c=c+1 end return m end

आप Lua को ऑनलाइन आज़मा सकते हैं , और इस सबमिशन को आज़माने के लिए निम्न कोड नमूने को कॉपी / पेस्ट कर सकते हैं :

-- The function that does the stuff
function f(m,l)
  c=1 
  while(c<#m)
  do 
    x=0 
    for j=1,#l 
    do 
      x=x+((type(m[c][l[j]])=="number")and 0 or 1)
    end
    m[c]=(x<#l and m[c] or nil)
    c=c+1 
   end 
   return m 
end
-- A function to format matrixes into "readable" strings
function printMatrix(matrix,len)
  s="{"
  for v=1,len
  do
    if matrix[v]~=nil
    then
      s=s.."{"..table.concat(matrix[v],",").."}"..(v<len and",\n "or"")
    end
  end
  s=s.."}"
  print(s)
end

nan="NaN"
-- Datas in, indexed as matrices[testCase][row][column]
matrices={{{7,nan,5,3},{5,4,nan,4},{nan,4,nan,9},{5,7,9,8}},
{{16,nan,3,13},{5,11,nan,8},{nan,7,nan,12},{4,14,-15,1}},
{{nan,nan,nan,nan},{nan,nan,nan,nan},{nan,nan,nan,nan},{nan,nan,nan,nan}}}
indexes={{1,3},{3},{1,2,4}}

-- looping so we can test lots of things at once :)
for i=1,#matrices
do
  print("\ninput: "..table.concat(indexes[i]," "))
  printMatrix(matrices[i],4)
  print("output:")
  printMatrix(f(matrices[i],indexes[i]),4)
end

0

गणितज्ञ, 52 51 49 46 बाइट्स

Delete[#,Extract[#,{;;,#2}]~Position~{NaN..}]&

इनपुट [मैट्रिक्स की सूची के रूप में, स्तंभों का वेक्टर]


प्रोग्रामिंग पहेलियाँ और कोड गोल्फ में आपका स्वागत है! :) कृपया अपने स्वरूपण को सही करें और चुनौती में पूछे गए कॉलम के अनुक्रमण सहित अपने इनपुट प्रारूप को निर्दिष्ट करें।
डेनकर

0

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

m#[]=m
m#r=[l|l<-m,any(<1/0)$map(l!!)r]

यह 0-आधारित सूचकांकों का उपयोग करता है। उपयोग उदाहरण (मैं sqrt(-1)बनाने के लिए उपयोग कर रहा हूँ NaN):

*Main> [[16,sqrt(-1),3,13], [5,11,sqrt(-1),8], [sqrt(-1),7,sqrt(-1),12], [4,14,-15,1]] # [0,2]
[[16.0,NaN,3.0,13.0],[5.0,11.0,NaN,8.0],[4.0,14.0,-15.0,1.0]]

सूची बोध के माध्यम से अन्य उत्तरों में देखा गया यह केवल एक साधारण फिल्टर है। एक खाली सूचकांक सूची का विशेष मामला अलग से पकड़ा गया है।

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