指定された非数値行を削除します


16

疑問がある場合:Nan = Non-numeric datatypeこのチャレンジの目的のため。


入力として行列/配列と列インデックスのリストを受け取るプログラムまたは関数を記述します。

課題は、指定された列のすべての要素が存在する行を削除することNanです。行内の他の要素が数値であるかどうかは関係ありません。次の例は、これをより明確にすることを願っています(1インデックス化されています)。

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

規則と説明:

  • 行列は常に空ではありません
  • 数値は有限ですが、必ずしも整数または正の値ではありません
  • 列インデックスベクトルは空にすることができます(この場合、行は削除されません)
  • 列インデックスの値がマトリックスの次元を超えることはありません
  • 列インデックスリストに重複がないと仮定できます。
  • インデックスがゼロまたは1の値を使用するかどうかを選択できます(指定してください)
  • 任意の便利な形式で入力できます
    • リストのリストとしての配列は問題ありません。列インデックスは個別の引数にすることができます
  • ans = 同様の出力が受け入れられます
  • 使用する非数値データ型のタイプを自由に選択できます
    • このデータ型で算術演算を実行したり、などの関数を使用して有限数に変換したりすることはできませんfloat(x)

これはコードゴルフなので、バイト単位の最短コードが勝ちます。

回答:


6

Pyth、16 19 10 9 7 10バイト

列インデックスはゼロから始まります。入力はリストのリストです。空の文字列を非数値として使用します。最初の行に列インデックスのリストを取り、2行目に値を持つマトリックスを取ります。

?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バイトのコストでそれを修正しました(かなりい)。仕事の後にもっとうまくやろうとしています...

アップデート2: @FryAmTheEggmanの助けを借りて、アルゴリズムを大幅に改善することで、10 9 7バイトにまで削減しました。

Update3: @ThomasKwaが発見したバグを修正。彼が提案した7バイトのソリューションは空の列インデックスを正しく処理しなかったので、ここでは3項でそのケースをキャッチします。このatmを短縮する方法がわかりません。


1
あなたは置き換えることができますJvzしてKQz入力、Q評価された入力に初期化されます。
PurkkaKoodari

@ Pietu1998どうもありがとう!:)私はその点で何かが欠けていることを知っていました。悲しいことに、より良い解決策を見つけるまで全体的にバイトカウントを増やす提案を実装するためにもう一度調べたときにバグを見つけました。
デンカー

1
?KEfnmklKm@TdKQQ空のリストはPythでは偽であり、割り当てステートメントは割り当てられた値を返します。これにより、いくつかのバイトが節約されます。Pythでゴルフをお楽しみください!:)
FryAmTheEggman 16

@FryAmTheEggman提案をありがとう。私はアルゴリズムを大幅に改善したため、もはや関係ありませんが、本当に助かりました!:)
デンカー

非常に良い:) L->fnks@LTQE
FryAmTheEggman

6

JavaScript(ES6)、48 46バイト

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

説明

行の配列を配列、およびチェックする列のインデックスが0の配列を期待します。配列の配列を返します。

ストレートフォワードfiltersomeNaNを使用してチェックしますn < Infinitytrue有限数の場合falseNaNsの場合)。

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

CJam、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)
デンカー

5つのバイト...の費用で固定し、くそ@DenkerAffe
マーティン・エンダー

私もそこにいました...あなたはまだ私の1バイト先でしたので、私の計画はまだうまくいきませんでした:P
Denker

「空の配列""」「空の文字列」という意味ですか?
ETHproductions 16

@ETHproductions CJamに違いはありません。文字列は単なる文字の配列であるため[]""同一であり、正規表現は同じです""(たとえば、空の配列を文字列化したときに得られるものです)。
マーティンエンダー

3

APL、19バイト

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

左の引数はインデックスのリストでなければならず(また、スカラーではなくリストでなければなりません)、右の引数は行列です。APLには数値と文字の2つのデータ型があるため、これにより文字型が除外されます。

テスト:

      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各アイテムの先頭から最初の要素を取得します
  • ⍬∘≡¨:空の数値リストと比較
  • ∨/:少なくとも1つのアイテムが一致する行を確認します
  • ⍵⌿⍨:行列からそれらの行を選択します

2

MATLAB、32 28バイト

私は自分の質問に一度答えます。MATLABでできることは28バイトです。私は両方allisnan何とか使用を避けたいと思っていましたが、まだ方法を見つけていません。

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

これは、最初の入力変数として入力行列を取り、2番目として列インデックスのリストを取る名前のない匿名関数です。

MATLABでは、NaN < Inffalse と評価されます。すべての値は有限であると想定できるため、値がより小さいかどうかのチェックは、数値でないinfかどうかのチェックと同等です。any(...,2)2番目の次元(行)に真の値があるかどうかを確認します。その場合、それらの行が返されます。

古いバージョン:

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

isnan(A(:,c))指定された列のブール値を持つ配列を返します。~all(isnan(A(:,c)),2)2番目の次元(行)に沿ったすべての値が非数値であるかどうかをチェックし、それを否定します。これにより、保持したい位置に1を持つブールベクトルが作成されます。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です。

実際、かなり自明です。行のped のインデックスがs selectである配列の要素。any?mapFixnum

サンプル実行:

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

R、49バイト

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

入力は1ベースです。この関数は、欠落している可能性のある行列(m)および列インデックスのベクトル()を取りますj

2つのテストケース:

> 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バイト

入力として行列と配列を受け取り、対応する行を含む行列を出力する関数nil。配列はCの配列とまったく同じfree()であるため、ガベージコレクターはそれほど遠くないので、消滅はそれを行うようなものです。

Luaでは配列のインデックスは1であり、この文字列"NaN"を非要素要素として使用します。

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

Mathematica、52 51 49 46バイト

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

入力は[リストのリストとしての行列、列のベクトル]


プログラミングパズルとコードゴルフへようこそ!:)チャレンジで尋ねられたように、フォーマットを修正し、列のインデックス付けを含む入力フォーマットを指定してください。
デンカー

0

Haskell、39バイト

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

これは、0ベースのインデックスを使用します。使用例(sの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]]

リスト内包を介した他の回答に見られるように、これは単なるフィルターです。空のインデックスリストの特殊なケースは個別に検出されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.