Xóa các hàng không số được chỉ định


16

Trong trường hợp có bất kỳ nghi ngờ nào: Nan = Non-numeric datatypecho các mục đích của thử thách này.


Viết chương trình hoặc hàm lấy ma trận / mảng làm đầu vào, cũng như danh sách các chỉ mục cột.

Thách thức là loại bỏ các hàng trong đó tất cả các thành phần trong các cột được chỉ định Nan. Không thành vấn đề nếu các phần tử khác trong hàng có số hay không. Các ví dụ sau đây hy vọng sẽ làm cho điều này rõ ràng hơn (đó là một chỉ mục):

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

Các quy tắc và làm rõ:

  • Ma trận sẽ luôn luôn trống
  • Các giá trị số sẽ là hữu hạn, nhưng không nhất thiết là số nguyên hoặc giá trị dương
  • Vectơ chỉ mục cột có thể trống (trong trường hợp đó sẽ không có hàng nào bị xóa)
  • Chỉ mục cột sẽ không bao giờ có giá trị vượt quá kích thước ma trận
  • Bạn có thể cho rằng sẽ không có bản sao trong danh sách chỉ mục cột
  • Bạn có thể chọn nếu bạn muốn sử dụng các giá trị 0 hoặc một chỉ mục (vui lòng ghi rõ)
  • Bạn có thể lấy đầu vào trên bất kỳ định dạng thuận tiện
    • Mảng như danh sách các danh sách là OK. Các chỉ mục cột có thể là các đối số riêng biệt
  • ans = và tương tự được chấp nhận trong đầu ra
  • Bạn có thể tự do chọn loại kiểu dữ liệu không phải là số mà bạn muốn sử dụng
    • Không thể thực hiện các phép toán số học với kiểu dữ liệu này hoặc chuyển đổi nó thành một số hữu hạn bằng cách sử dụng các hàm như float(x).

Đây là mã golf, vì vậy mã ngắn nhất trong byte thắng.

Câu trả lời:


6

Pyth, 16 19 10 9 7 10 byte

Các chỉ số cột bắt đầu từ 0. Đầu vào là một danh sách các danh sách. Sử dụng một chuỗi rỗng là giá trị không phải là số. Đưa danh sách các chỉ mục cột trên dòng đầu tiên và Ma trận với các giá trị trên dòng thứ hai.

?Qf-QxkTEE

Hãy thử trực tuyến!

Giải trình

?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

Cập nhật: Giải pháp đầu tiên của tôi xử lý một danh sách trống các chỉ mục cột sai. Đã sửa nó (khá xấu) với chi phí 3 Byte. Gonna cố gắng làm điều đó tốt hơn sau khi làm việc ...

Cập nhật 2: Đánh gôn xuống còn 10 9 7 byte, với một số trợ giúp từ @FryAmTheEggman bằng cách cải thiện thuật toán đáng kể.

Update3: Đã sửa lỗi @ThomasKwa được phát hiện. Giải pháp 7 byte được đề xuất của anh ấy đã không xử lý đúng các chỉ mục cột trống, vì vậy tôi chỉ bắt trường hợp đó với một ternary ở đây. Tôi không thấy làm thế nào tôi có thể rút ngắn máy rút tiền này.


1
Bạn có thể thay thế Jbằng vzKvới Q. zđược khởi tạo để đầu vào, Qđể đánh giá đầu vào.
PurkkaKoodari

@ Pietu1998 Cảm ơn rất nhiều! :) Tôi biết tôi đã thiếu một cái gì đó trong vấn đề đó. Đáng buồn là tôi đã tìm thấy một lỗi khi tôi nhìn lại nó để thực hiện đề xuất của bạn, điều này làm tăng tổng số byte của tôi cho đến khi tôi tìm thấy một giải pháp đẹp hơn.
Denker

1
?KEfnmklKm@TdKQQdanh sách trống là giả mạo trong Pyth và các câu lệnh gán trả về giá trị được gán, giúp lưu một số byte. Tôi hy vọng bạn thích chơi gôn Pyth! :)
FryAmTheEggman

@FryAmTheEggman Cảm ơn những lời đề nghị. Không thực sự phù hợp nữa vì tôi đã cải thiện thuật toán rất nhiều, nhưng tôi thực sự đánh giá cao sự giúp đỡ! :)
Denker

Rất đẹp :) bạn có thể lưu một byte khác bằng cách sử dụng 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)

Giải trình

Yêu cầu một mảng các hàng dưới dạng mảng và một mảng các số được lập chỉ mục 0 cho các cột cần kiểm tra. Trả về một mảng các mảng.

Thẳng tiến filtersome. Kiểm tra NaNbằng cách sử dụng n < Infinity( trueđối với số hữu hạn, falsecho 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>


Xử lý tốt các trường hợp cạnh đó!
Neil

3

CJam, 18 byte

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

Một khối không tên (hàm) mong đợi ma trận và các chỉ số cột dựa trên zero trên ngăn xếp (ma trận trên cùng), để lại ma trận được lọc trên ngăn xếp. Tôi đang sử dụng mảng trống ""làm giá trị không phải là số.

Kiểm tra nó ở đây.

Giải trình

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

Tôi đang kiểm tra nó sai hay điều này có vi phạm quy tắc về việc không có chỉ số cột nào không? The column index vector can be empty (in which case no rows will be removed)
Denker

@DenkerAffe Damn, đã sửa với giá 5 byte ...
Martin Ender

Tôi cũng ở đó ... Bạn vẫn còn một byte trước tôi, vì vậy kế hoạch của tôi chưa thành công: P
Denker

"mảng trống """ Ý bạn là "chuỗi rỗng"?
Sản phẩm ETH

@ETHproductions Không có sự khác biệt trong CJam. Các chuỗi chỉ là các mảng ký tự, do đó [], ""giống hệt nhau và biểu diễn chính tắc là ""(ví dụ: đó là những gì bạn nhận được khi xâu chuỗi một mảng trống).
Martin Ender

3

APL, 19 byte

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

Đối số bên trái phải là danh sách các chỉ mục (và nó phải là danh sách, không phải là vô hướng), đối số bên phải là ma trận. APL có hai kiểu dữ liệu, số và ký tự, vì vậy, bộ lọc này loại ra các loại ký tự.

Các xét nghiệm:

      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

Giải trình:

  • ⍵[;⍺]: chọn các cột đã cho từ ma trận
  • 0↑¨: lấy các 0yếu tố đầu tiên từ đầu của mỗi mục
  • ⍬∘≡¨: so sánh với danh sách trống số
  • ∨/: xem trong đó hàng nào có ít nhất một mục khớp
  • ⍵⌿⍨: chọn các hàng đó từ ma trận

2

MATLAB, 32 28 byte

Tôi sẽ trả lời câu hỏi của riêng tôi một lần. Điều tốt nhất tôi có thể làm trong MATLAB là 28 byte. Tôi đã hy vọng tránh sử dụng cả hai allisnanbằng cách nào đó, nhưng vẫn chưa tìm được cách nào.

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

Kiểm tra:

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

Đây là một hàm ẩn danh chưa được đặt tên, lấy ma trận đầu vào làm biến đầu vào đầu tiên và một danh sách các chỉ mục cột làm thứ hai.

Trong MATLAB, NaN < Infđánh giá thành sai. Có thể giả định rằng tất cả các giá trị là hữu hạn, do đó kiểm tra xem các giá trị nhỏ hơn infcó tương đương với kiểm tra nếu chúng không phải là số. any(...,2)kiểm tra nếu có bất kỳ giá trị thực nào dọc theo chiều thứ hai (hàng). Nếu đó là trường hợp, thì những hàng đó sẽ được trả lại.

Phiên bản cũ:

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

isnan(A(:,c))trả về một mảng với booleans cho các cột được chỉ định. ~all(isnan(A(:,c)),2)kiểm tra xem tất cả các giá trị dọc theo chiều thứ hai (hàng) không phải là số và phủ định nó. Điều này dẫn đến một vectơ boolean với các vectơ ở các vị trí chúng ta muốn giữ. A(~all(isnan(A(:,c)),2),:)sử dụng lập chỉ mục logic để trích xuất toàn bộ các hàng cho A.


Giải pháp 24 byte sau đây sẽ hoạt động nếu các giá trị được đảm bảo khác không:

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

2

Ruby, 48 byte

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

Đầu vào là 0 chỉ số dựa trên 1 .

Khá tự giải thích, thực sự. selectcác phần tử từ mảng trong đó any?các chỉ số mapped trên hàng là Fixnums.

Chạy mẫu:

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: Cuối cùng tôi đã viết đúng từ này trong lần thử đầu tiên! \ o /


2

K5, 15 byte

Điều này sử dụng các cột được lập chỉ mục 0 và biểu diễn ma trận danh sách tự nhiên của K:

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

Lập chỉ mục vào ma trận ( x@) các hàng trong đó ( &) không phải tất cả của mỗi ( ~&/') là null ( ^).

Trong hành động:

  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)

NaNđược thể hiện trong đầu vào là N. Lập chỉ mục là 1 dựa trên. Ví dụ, trong trường hợp thử nghiệm đầu tiên, đầu vào là

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

Hãy thử trực tuyến!

Giải trình

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])),]

Đầu vào là 1 dựa trên. Hàm lấy một ma trận ( m) và một vectơ chỉ mục cột ( j) có thể bị thiếu.

Hai trường hợp thử nghiệm:

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

Một hàm lấy một ma trận và một mảng làm đầu vào và xuất ra một ma trận với các hàng tương ứng tại nil. Vì các mảng khá giống với mảng của C, việc hủy hoại giống như lấy free()nó vì bộ thu gom rác không ở đâu xa.

Mảng được lập chỉ mục 1 trong Lua và tôi sử dụng chuỗi "NaN" làm phần tử không được đề cử.

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

Bạn có thể thử Lua trực tuyến và sao chép / dán mẫu mã sau để thử trình này:

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

Toán học, 52 51 49 46 byte

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

Đầu vào là [ma trận như danh sách danh sách, vectơ cột]


Chào mừng bạn đến với Câu đố lập trình & Code Golf! :) Vui lòng sửa định dạng của bạn và chỉ định định dạng đầu vào của bạn bao gồm lập chỉ mục các cột như được hỏi trong thử thách.
Denker

0

Haskell, 39 byte

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

Điều này sử dụng các chỉ số dựa trên 0. Ví dụ sử dụng (Tôi đang sử dụng sqrt(-1)để tạo NaNs):

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

Nó chỉ là một bộ lọc đơn giản như được thấy trong các câu trả lời khác thông qua việc hiểu danh sách. Trường hợp đặc biệt của một danh sách chỉ mục trống được bắt riêng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.