Hapus baris non-numerik yang ditentukan


16

Jika ada keraguan: Nan = Non-numeric datatypeuntuk keperluan tantangan ini.


Tulis program atau fungsi yang mengambil matriks / array sebagai input, serta daftar indeks kolom.

Tantangannya adalah menghapus baris tempat semua elemen dalam kolom yang ditentukan Nan. Tidak masalah apakah elemen lain di baris itu numerik atau tidak. Contoh-contoh berikut diharapkan akan membuat ini lebih jelas (ini satu-diindeks):

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

Aturan dan klarifikasi:

  • Matriks akan selalu kosong
  • Nilai numerik akan terbatas, tetapi tidak harus bilangan bulat atau nilai positif
  • Vektor indeks kolom bisa kosong (dalam hal ini tidak ada baris akan dihapus)
  • Indeks kolom tidak akan pernah memiliki nilai yang melebihi dimensi matriks
  • Anda dapat mengasumsikan tidak akan ada duplikat dalam daftar indeks kolom
  • Anda dapat memilih jika ingin menggunakan nilai nol atau satu indeks (harap sebutkan)
  • Anda dapat mengambil input pada format apa pun yang nyaman
    • Array sebagai daftar daftar adalah OK. Indeks kolom dapat berupa argumen terpisah
  • ans = dan yang serupa diterima dalam output
  • Anda bebas memilih tipe data non-numerik apa yang ingin Anda gunakan
    • Seharusnya tidak mungkin untuk melakukan operasi aritmatika dengan tipe data ini, atau mengonversinya menjadi angka terbatas menggunakan fungsi seperti float(x).

Ini adalah kode golf, jadi kode terpendek dalam byte menang.

Jawaban:


6

Pyth, 16 19 10 9 7 10 Bytes

Indeks kolom dimulai dari nol. Input adalah daftar daftar. Menggunakan string kosong sebagai nilai non-numerik. Mengambil daftar indeks kolom pada baris pertama dan Matriks dengan nilai-nilai pada baris kedua.

?Qf-QxkTEE

Cobalah online!

Penjelasan

?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

Pembaruan: Solusi pertama saya menangani daftar indeks kolom yang kosong salah. Memperbaikinya (cukup jelek) dengan biaya 3 Bytes. Akan mencoba melakukannya lebih baik setelah bekerja ...

Pembaruan 2: Golf turun ke 10 9 7 byte, dengan bantuan dari @FryAmTheEggman an dengan meningkatkan algoritme secara signifikan.

Update3: Memperbaiki bug @ThomasKwa ditemukan. Solusi 7-byte yang diusulkannya tidak menangani indeks kolom kosong dengan benar, jadi saya hanya menangkap kasus itu dengan ternary di sini. Saya tidak melihat bagaimana saya dapat mempersingkat atm ini.


1
Anda dapat mengganti Jdengan vzdan Kdengan Q. zdiinisialisasi ke input, Quntuk input dievaluasi.
PurkkaKoodari

@ Pietu1998 Terima kasih banyak! :) Saya tahu saya kehilangan sesuatu dalam hal itu. Sayangnya saya menemukan bug ketika saya melihatnya lagi untuk mengimplementasikan saran Anda yang secara keseluruhan meningkatkan jumlah byte saya sampai saya menemukan solusi yang lebih baik.
Denker

1
?KEfnmklKm@TdKQQdaftar kosong palsu di Pyth, dan pernyataan penugasan mengembalikan nilai yang ditugaskan, yang menyimpan beberapa byte. Saya harap Anda menikmati golf Pyth! :)
FryAmTheEggman

@FryAmTheEggman Terima kasih atas sarannya. Tidak benar-benar relevan lagi karena saya banyak meningkatkan algoritme, tetapi saya sangat menghargai bantuannya! :)
Denker

Sangat bagus :) Anda dapat menyimpan byte lain menggunakan L->fnks@LTQE
FryAmTheEggman

6

JavaScript (ES6), 48 46 byte

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

Penjelasan

Mengharapkan array baris sebagai array, dan array angka 0-diindeks untuk kolom untuk memeriksa. Mengembalikan array array.

Terus terang filterdan some. Memeriksa NaNdengan menggunakan n < Infinity( trueuntuk nomor hingga, falseuntuk NaNs).

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>


Penanganan yang bagus dari kasing tepi!
Neil

3

CJam, 18 byte

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

Blok yang tidak disebutkan namanya (fungsi) mengharapkan matriks dan indeks kolom berbasis nol pada stack (matriks di atas), yang meninggalkan matriks yang difilter pada stack. Saya menggunakan array kosong ""sebagai nilai non-numerik.

Uji di sini.

Penjelasan

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

Apakah saya salah mengujinya atau apakah ini melanggar aturan tentang tidak ada indeks kolom yang diberikan? The column index vector can be empty (in which case no rows will be removed)
Denker

@DenkerAffe Damn, ditetapkan dengan biaya 5 byte ...
Martin Ender

Aku ada di sana juga ... Kamu masih satu byte di depanku, jadi rencanaku belum bekerja: P
Denker

"array kosong """ Apakah maksud Anda "string kosong"?
ETHproduk

@ ETHproductions Tidak ada perbedaan dalam CJam. String hanyalah array karakter, jadi []dan ""identik dan representasi kanonik adalah ""(misalnya itu yang Anda dapatkan ketika Anda merender array kosong).
Martin Ender

3

APL, 19 byte

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

Argumen kiri harus daftar indeks (dan harus daftar, bukan skalar), argumen yang tepat adalah matriks. APL memiliki dua tipe data, angka, dan karakter, jadi ini menyaring tipe karakter.

Tes:

      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

Penjelasan:

  • ⍵[;⍺]: pilih kolom yang diberikan dari matriks
  • 0↑¨: ambil 0elemen pertama dari awal setiap item
  • ⍬∘≡¨: dibandingkan dengan daftar kosong numerik
  • ∨/: lihat baris mana yang paling tidak cocok dengan satu item
  • ⍵⌿⍨: pilih baris-baris itu dari matriks

2

MATLAB, 32 28 byte

Saya akan menjawab pertanyaan saya sendiri sekali. Yang terbaik yang bisa saya lakukan di MATLAB adalah 28 byte. Saya berharap untuk tidak menggunakan keduanya alldan isnanentah bagaimana, tetapi belum menemukan cara.

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

Uji:

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

Ini adalah fungsi anonim tanpa nama yang menggunakan matriks input sebagai variabel input pertama, dan daftar indeks kolom sebagai yang kedua.

Di MATLAB, NaN < Infevaluasi menjadi false. Dapat diasumsikan bahwa semua nilai terbatas, sehingga memeriksa jika nilai kurang dari infsetara dengan memeriksa jika mereka non-numerik. any(...,2)memeriksa apakah ada nilai sebenarnya di sepanjang dimensi kedua (baris). Jika itu masalahnya, maka baris-baris itu akan dikembalikan.

Versi lama:

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

isnan(A(:,c))mengembalikan array dengan boolean untuk kolom yang ditentukan. ~all(isnan(A(:,c)),2)memeriksa apakah semua nilai di sepanjang dimensi kedua (baris) adalah non-numerik, dan meniadakannya. Ini menghasilkan vektor boolean dengan yang ada di posisi yang ingin kita pertahankan. A(~all(isnan(A(:,c)),2),:)menggunakan pengindeksan logis untuk mengekstrak seluruh baris A.


Solusi 24 byte berikut ini akan berfungsi jika nilainya dijamin tidak nol:

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

2

Ruby, 48 byte

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

Input adalah indeks berbasis 0 1 .

Cukup jelas, sebenarnya. selectelemen dari array di mana any?indeks mapmengayuh pada baris adalah Fixnums.

Contoh dijalankan:

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: Saya akhirnya mengeja kata ini dengan benar pada percobaan pertama! \Hai/


2

K5, 15 byte

Ini menggunakan kolom yang diindeks 0 dan representasi matriks daftar-daftar-alami K:

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

Indeks ke dalam matriks ( x@) baris di mana ( &) tidak semua dari masing-masing ( ~&/') adalah null ( ^).

Dalam aksi:

  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 byte

tiZ)tn?ZN!XA~Y)

NaNdirepresentasikan dalam input sebagai N. Pengindeksan adalah berbasis 1. Misalnya, dalam kasus uji pertama inputnya adalah

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

Cobalah online!

Penjelasan

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 byte

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

Input berbasis 1. Fungsi ini mengambil matriks (m ) dan vektor indeks kolom ( j) yang mungkin hilang.

Dua uji kasus:

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

Fungsi yang mengambil matriks dan array sebagai input, dan menampilkan matriks dengan baris yang sesuai di nil. Karena array sama dengan array C, nihilating sama denganfree() itu karena pengumpul sampah tidak jauh.

Array 1-diindeks dalam Lua, dan saya menggunakan string "NaN"sebagai elemen non-nomber.

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

Anda dapat mencoba Lua online , dan menyalin / menempelkan contoh kode berikut untuk mencoba pengiriman ini:

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

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

Input adalah [matriks sebagai daftar daftar, vektor kolom]


Selamat Datang di Programming Puzzles & Code Golf! :) Harap perbaiki format Anda dan tentukan format input Anda termasuk pengindeksan kolom seperti yang ditanyakan dalam tantangan.
Denker

0

Haskell, 39 byte

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

Ini menggunakan indeks berbasis 0. Contoh penggunaan (saya gunakan sqrt(-1)untuk membuatNaN 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]]

Itu hanya filter sederhana seperti yang terlihat pada jawaban lain melalui pemahaman daftar. Kasus khusus dari daftar indeks kosong ditangkap secara terpisah.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.