Belirtilen sayısal olmayan satırları kaldır


16

Herhangi bir şüphe durumunda: Nan = Non-numeric datatypebu meydan okuma için.


Bir matrisi / diziyi girdi olarak alan bir program veya işlev ve ayrıca sütun indeksleri listesi yazın.

Zorluk, belirtilen sütunlardaki tüm öğelerin bulunduğu satırları kaldırmaktır Nan. Satırdaki diğer öğelerin sayısal olması önemli değildir. Aşağıdaki örnekler umarım bunu daha açık hale getirecektir (tek endekslidir):

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:
 []

Kurallar ve açıklamalar:

  • Matris her zaman boş olmayacaktır
  • Sayısal değerler sonlu olacaktır, ancak mutlaka tamsayılar veya pozitif değerler olmayacaktır.
  • Sütun dizini vektörü boş olabilir (bu durumda hiçbir satır kaldırılmaz)
  • Sütun dizini asla matris boyutlarını aşan değerlere sahip olmaz
  • Sütun dizini listesinde kopya olmayacağını varsayabilirsiniz.
  • Sıfır veya tek dizinli değerler kullanmak isteyip istemediğinizi seçebilirsiniz (lütfen belirtin)
  • Girişi istediğiniz herhangi bir formatta alabilirsiniz
    • Liste listesi olarak dizi tamam. Sütun dizinleri ayrı bağımsız değişkenler olabilir
  • ans = ve benzeri çıktıda kabul edilir
  • Ne tür bir sayısal olmayan veri türü kullanmak istediğinizi seçebilirsiniz
    • Bu veri tipiyle aritmetik işlemler yapmak veya gibi fonksiyonları kullanarak sonlu bir sayıya dönüştürmek mümkün olmamalıdır float(x).

Bu kod golf, bayt kazanmak çok kısa kod.

Yanıtlar:


6

Pyth, 16 19 10 9 7 10 Bayt

Sütun indeksleri sıfırdan başlar. Girdi listelerin listesidir. Boş bir dizeyi sayısal olmayan değer olarak kullanır. Birinci satırdaki sütun indekslerini ve ikinci satırdaki değerleri içeren Matrisi listeler.

?Qf-QxkTEE

Çevrimiçi deneyin!

açıklama

?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

Güncelleme: İlk çözümüm boş bir sütun indeks listesi yanlış işledi. 3 Bayt pahasına (oldukça çirkin) düzeltildi. İşten sonra daha iyisini yapmaya çalışacağım ...

Güncelleme 2: için aşağı golfed 10 9 anlamlı algoritmayı iyileştirerek @FryAmTheEggman bir bazı yardımıyla, 7 bayt.

Update3 : @ThomasKwa'nın keşfettiği bir hata düzeltildi. Önerilen 7 baytlık çözümü boş sütun indekslerini doğru işlemedi, bu yüzden bu davayı burada bir üçlü ile yakaladım. Bu ATM'yi nasıl kısaltabileceğimi anlamıyorum.


1
Sen yerini alabilir Jile vzve Kile Q. zgirişe ilklendirilir,Qdeğerlendirilen girdiye .
PurkkaKoodari

@ Pietu1998 Çok teşekkürler! :) Bu konuda bir şey eksik olduğumu biliyordum. Ne yazık ki, daha güzel bir çözüm bulana kadar genel olarak bayt sayımı artıran önerinizi uygulamak için tekrar baktığımda bir hata buldum.
Denker

1
?KEfnmklKm@TdKQQboş listeler Pyth'te yanlıştır ve atama ifadeleri, atanan değeri döndürerek bazı baytları kaydeder. Umarım golf Pyth beğenirsiniz! :)
FryAmTheEggman

@FryAmTheEggman Öneriler için teşekkürler. Algoritmayı çok geliştirdiğim için artık gerçekten alakalı değil, ama gerçekten yardımı takdir ediyorum! :)
Denker

Çok güzel :) kullanarak başka bir bayt kaydedebilirsiniz L ->fnks@LTQE
FryAmTheEggman

6

JavaScript (ES6), 48 46 bayt

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

açıklama

Bir dizi diziyi diziler olarak ve sütunların kontrol etmesi için 0 dizinli sayı dizisini bekler. Bir dizi dizi döndürür.

Düz ileri filterve some. Denetler NaNkullanılarak n < Infinity(true sonlu sayılar falseiçin, NaNs için).

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>


Bu kenar kasanın güzel kullanımı!
Neil

3

CJam, 18 bayt

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

Filtrelenmiş matrisi yığın üzerinde bırakan, matris ve yığın üzerindeki sıfır temelli sütun indekslerini (üstte matris) bekleyen isimsiz bir blok (işlev). ""Sayısal olmayan değer olarak boş dizi kullanıyorum .

Burada test edin.

açıklama

{     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.

Yanlış mı test ediyorum yoksa belirli bir sütun dizini hakkında kuralı ihlal ediyor mu? The column index vector can be empty (in which case no rows will be removed)
Denker

@DenkerAffe Lanet, 5 bayt maliyetle sabitlendi ...
Martin Ender

Ben de oradaydım ... Tho hala bir bayt önümde, bu yüzden planım henüz işe yaramadı: P
Denker

"boş dizi """ Bunu mu demek istediniz: "boş dize"?
ETHproductions

@ETHproductions CJam'da fark yok. Dizeler yüzden, karakterlerin sadece diziler []ve ""aynıdır ve kanonik temsilidir ""(örn Eğer boş bir dizi stringify ne elde var).
Martin Ender

3

APL, 19 bayt

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

Sol argüman bir indeks listesi olmalıdır (ve bir skaler değil bir liste olmalıdır), sağ argüman matristir. APL'nin iki veri tipi vardır: sayılar ve karakterler, bu nedenle karakter türlerini filtreler.

Testler:

      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

Açıklama:

  • ⍵[;⍺]: matristen verilen sütunları seç
  • 0↑¨: ilkini al 0 her öğenin başlangıcından itibaren öğeleri alır
  • ⍬∘≡¨: sayısal boş listeyle karşılaştır
  • ∨/: en az bir öğenin hangi satırlarla eşleştiğine bakın
  • ⍵⌿⍨: matristen bu satırları seçin

2

MATLAB, 32 28 bayt

Kendi sorumu bir kez cevaplayacağım. MATLAB'da yapabileceğim en iyi şey 28 byte. Her ikisini de allve bir isnanşekilde kullanmaktan kaçınmayı umuyordum , ancak henüz bir yol bulamadım.

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

Ölçek:

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

Bu, giriş matrisini ilk giriş değişkeni olarak alan adsız bir anonim işlevdir ve ikinci olarak sütun indekslerinin bir listesidir.

MATLAB'da NaN < Infyanlış olarak değerlendirilir. Tüm değerlerin sonlu olduğu varsayılabilir, böylelikle değerlerin infsayısal olup olmadıklarının kontrol edilmesine eşit olup olmadığını kontrol eder.any(...,2)ikinci boyut (satırlar) boyunca gerçek değerler olup olmadığını kontrol eder. Bu durumda, bu satırlar döndürülür.

Eski versiyon:

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

isnan(A(:,c))belirtilen sütunlar için booleans içeren bir dizi döndürür. ~all(isnan(A(:,c)),2)ikinci boyuttaki (satırlar) tüm değerlerin sayısal olup olmadığını kontrol eder ve bunu reddeder. Bu, tutmak istediğimiz konumlarda olanlarla birlikte bir boolean vektörü ile sonuçlanır. A(~all(isnan(A(:,c)),2),:)için tüm satırları ayıklamak üzere mantıksal indeksleme kullanır A.


Değerlerin sıfır olmadığı garanti edilirse aşağıdaki 24 bayt çözümü işe yarayacaktır:

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

2

Ruby, 48 bayt

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

Girdi 0 tabanlı endekslerdir 1 .

Aslında oldukça açıklayıcı. selectdiziden elemanları any?endekslerinin mapsatır üzerinde ped olan Fixnums.

Örnek çalışma:

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: Sonunda ilk denemede bu kelimeyi doğru yazdım ! \Ö/


2

K5, 15 bayt

Bu, 0 dizinli sütunları ve K'nın doğal liste listesi matris temsilini kullanır:

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

( x@) Öğesinin &her birinin ( ~&/') boş olmadığı ( ) olmadığı satırları matrise ( ) dizinleyin ^.

Eylemde:

  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 bayt

tiZ)tn?ZN!XA~Y)

NaN, girişte olarak gösterilir N. Endeksleme 1 tabanlıdır. Örneğin, ilk test durumunda giriş

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

Çevrimiçi deneyin!

açıklama

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

R, 49 bayt

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

Giriş 1 tabanlıdır. İşlev bir matris ( m) ve bir sütun indeksleri (j eksik olabilecek bir ) .

İki test durumu:

> 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

Lua, 148 Bayt

Bir matrisi ve diziyi girdi olarak alan ve karşılık gelen satırları olan bir matrisi çıktılayan bir işlev nil. Diziler C'nin dizileriyle tamamen aynı olduğundan, nihilatingfree() , çöp toplama çok uzak olmadığı için buna .

Diziler "NaN"Lua'da 1 dizinli ve dizeyi nomber olmayan bir eleman olarak kullanıyorum.

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

Deneyebilirsin çevrimiçi Lua Bu gönderimi denemek için aşağıdaki kod örneğini yapıştırın / ve kopyalama:

-- 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

Mathematica, 52 51 49 46 bayt

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

Girdi [liste listesi olarak matris, sütun vektörü]


Programlama Bulmacaları ve Kod Golf hoş geldiniz! :) Lütfen biçimlendirmenizi düzeltin ve sınamada istendiği gibi sütunların dizine eklenmesi dahil girdi biçiminizi belirtin.
Denker

0

Haskell, 39 bayt

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

Bu, 0 tabanlı indeksler kullanır. Kullanım örneği ( sqrt(-1)oluşturmak için kullanıyorumNaN s ):

*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]]

Liste anlama yoluyla diğer cevaplarda görüldüğü gibi basit bir filtre. Boş bir indeks listesinin özel durumu ayrı olarak yakalanır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.