숫자가 아닌 지정된 행 제거


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

규칙 및 설명 :

  • 행렬은 항상 비어 있지 않습니다.
  • 숫자 값은 유한하지만 반드시 정수 또는 양수 값은 아닙니다
  • 열 인덱스 벡터는 비어있을 수 있습니다 (이 경우 행이 제거되지 않음)
  • 열 인덱스에는 행렬 크기를 초과하는 값이 없습니다.
  • 열 인덱스 목록에 중복이 없다고 가정 할 수 있습니다
  • 인덱스가 없거나 0 인 값을 사용할지 선택할 수 있습니다 (지정하십시오).
  • 편리한 형식으로 입력 할 수 있습니다
    • 리스트리스트로서의 배열은 OK입니다. 열 인덱스는 별도의 인수가 될 수 있습니다
  • ans = 비슷한 결과가 출력에 허용됩니다.
  • 사용하려는 숫자가 아닌 데이터 유형의 유형을 자유롭게 선택할 수 있습니다
    • 이 데이터 유형으로 산술 연산을 수행하거나와 같은 함수를 사용하여 유한 수로 변환하는 것은 불가능합니다 float(x).

이것은 코드 골프이므로 바이트 단위의 가장 짧은 코드가 이깁니다.

답변:


6

Pyth, 16 19 10 9 7 10 바이트

열 인덱스는 0에서 시작합니다. 입력은 목록의 목록입니다. 빈 문자열을 숫자가 아닌 값으로 사용합니다. 첫 번째 줄의 열 인덱스 목록과 두 번째 줄의 값이있는 행렬을 가져옵니다.

?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 바이트 솔루션은 빈 열 인덱스를 올바르게 처리하지 않았으므로 여기서는 삼항으로 그 경우를 잡습니다. 이 ATM을 어떻게 줄일 수 있는지 모르겠습니다.


1
당신은 대체 할 수 JvzK함께 Q. z입력 Q으로 평가되고 입력이 평가됩니다.
PurkkaKoodari

@ Pietu1998 감사합니다! :) 나는 그 점에서 뭔가 빠진 것을 알았습니다. 슬프게도 더 나은 해결책을 찾을 때까지 전체적으로 바이트 수를 늘리는 제안을 구현하기 위해 다시 보았을 때 버그를 발견했습니다.
Denker

1
?KEfnmklKm@TdKQQ빈리스트는 Pyth에서 거짓이며, 할당 문은 할당 된 값을 반환하여 일부 바이트를 절약합니다. Pyth 골프를 즐기시기 바랍니다! :)
FryAmTheEggman

@FryAmTheEggman 제안 해 주셔서 감사합니다. 알고리즘을 많이 개선 한 이후로 더 이상 관련이 없지만 도움을 주셔서 감사합니다! :)
Denker

당신이 사용하는 다른 바이트를 저장할 수 있습니다 :) 아주 좋은 L> -fnks@LTQE
FryAmTheEggman

6

자바 스크립트 (ES6), 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에 대한 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>


그 엣지 케이스를 멋지게 취급합니다!
Neil

3

CJam, 18 바이트

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

스택에 필터링 된 행렬을 남기는 스택의 매트릭스와 0부터 시작하는 열 인덱스를 예상하는 명명되지 않은 블록 (함수)입니다. 빈 배열 ""을 숫자가 아닌 값으로 사용하고 있습니다.

여기에서 테스트하십시오.

설명

{     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

@ DenkerAffe 젠장, 5 바이트의 비용으로 고정 ...
마틴 엔더

나도 거기 있었어 ... 너는 여전히 나보다 1 바이트 앞서서 내 계획이 아직 해결되지 않았다 : P
Denker

"빈 배열 """ "빈 문자열"을 의미 했습니까?
ETHproductions

@ETHproductions CJam에는 차이가 없습니다. 문자열 때문에, 문자의 단지 배열 인 []""동일하며 정규 표현이다 ""(예를 들어, 당신이 하늘의 배열을 캐릭터 라인 화 할 때 무엇을 얻을).
마틴 엔더

3

APL, 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 바이트입니다. 난 둘 다 사용하지 않는 것이 좋겠습니다 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

이름없는 익명 함수로, 입력 행렬을 첫 번째 입력 변수로 사용하고 열 인덱스 목록을 두 번째로 사용합니다.

MATLAB에서는 NaN < Inffalse로 평가됩니다. 모든 값이 유한 한 것으로 가정하여 값이 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.


값이 0이 아닌 것으로 보장되면 다음 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가 표시되는 배열의 요소 는 s입니다.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 : 나는 첫 번째 시도에서 마침내이 단어의 철자를 정확하게 입력했습니다! \영형/


2

K5, 15 바이트

이것은 색인이없는 열과 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 누락 된 ) 합니다.

두 가지 테스트 사례 :

> 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의 배열과 매우 동일하므로 nihilating은free() 가비지 수집기가 멀리 떨어져 있지 않기 때문에 .

배열은 Lua에서 1 인덱싱되며 문자열 "NaN"을 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

Lua online 을 시도하고 다음 코드 샘플을 복사 / 붙여 넣기하여이 제출을 시도 할 수 있습니다 .

-- 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..}]&

입력은 [리스트 목록, 행렬 벡터로 행렬]


프로그래밍 퍼즐 및 코드 골프에 오신 것을 환영합니다! :) 형식을 수정하고 챌린지에서 요청한대로 열의 색인 생성을 포함하여 입력 형식을 지정하십시오.
Denker

0

하스켈, 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.