Удалить указанные нечисловые строки


16

В случае каких-либо сомнений: Nan = Non-numeric datatypeдля целей этого вызова.


Напишите программу или функцию, которая принимает матрицу / массив в качестве входных данных, а также список индексов столбцов.

Задача состоит в том, чтобы удалить строки, в которых находятся все элементы в указанных столбцах Nan. Не имеет значения, являются ли другие элементы в строке числовыми или нет. Надеемся, что следующие примеры сделают это более понятным (он одноиндексный):

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

Правила и разъяснения:

  • Матрица всегда будет непустой
  • Числовые значения будут конечными, но не обязательно целыми или положительными
  • Вектор индекса столбца может быть пустым (в этом случае строки не будут удалены)
  • Индекс столбца никогда не будет иметь значений, превышающих размеры матрицы
  • Вы можете предположить, что в списке индексов столбцов не будет дубликатов
  • Вы можете выбрать, хотите ли вы использовать нулевые или одноиндексированные значения (пожалуйста, укажите)
  • Вы можете принять вход в любом удобном формате
    • Массив как список списков в порядке. Индексы столбцов могут быть отдельными аргументами
  • ans = и подобное принимается в выводе
  • Вы можете выбрать, какой тип нечислового типа данных вы хотите использовать
    • Должно быть невозможным выполнение арифметических операций с этим типом данных или преобразование его в конечное число с использованием таких функций, как float(x).

Это код гольф, поэтому выигрывает самый короткий код в байтах.

Ответы:


6

Pyth, 16 19 10 9 7 10 байт

Индексы столбцов начинаются с нуля. Ввод представляет собой список списков. Использует пустую строку в качестве нечислового значения. Принимает список индексов столбцов в первой строке и матрицы со значениями во второй строке.

?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: увеличено до 10 9 7 байт при некоторой помощи @FryAmTheEggman путем значительного улучшения алгоритма.

Обновление 3: исправлена ​​ошибка, обнаруженная @ThomasKwa. Его предложенное 7-байтовое решение не правильно обрабатывало индексы пустых столбцов, поэтому я просто уловил этот случай с троичным здесь. Я не вижу, как я могу сократить этот банкомат.


1
Вы можете заменить Jна vzи Kс Q. zинициализируется для ввода, Qдля оцениваемого ввода.
PurkkaKoodari

@ Pietu1998 Большое спасибо! :) Я знал, что что-то упустил в этом отношении. К сожалению, я обнаружил ошибку, когда снова посмотрел на нее, чтобы реализовать ваше предложение, которое в целом увеличивает количество моих байтов, пока я не нашел более подходящее решение.
Денкер

1
?KEfnmklKm@TdKQQпустые списки ложны в Pyth, и операторы присваивания возвращают значение, которое было присвоено, что экономит несколько байтов. Я надеюсь, вам понравится играть в гольф Pyth! :)
FryAmTheEggman

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

объяснение

Ожидается массив строк в виде массивов и массив нумерованных номеров для проверяемых столбцов. Возвращает массив массивов.

Прямо вперед 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>


Хорошая обработка этого крайнего случая!
Нил

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)
Денкер

@DenkerAffe Черт, исправлено за 5 байтов ...
Мартин Эндер

Я тоже был там ... Ты все еще на шаг впереди меня, так что мой план еще не сработал: P
Denker

"пустой массив """ Вы имели в виду "пустая строка"?
ETHproductions

@ETHproductions Нет никакой разницы в CJam. Строки - это просто массивы символов, поэтому[] и ""являются идентичными и каноническое представление ""(например , это то , что вы получаете , когда вы stringify пустой массив).
Мартин Эндер

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 байтов. Я надеялся избежать использования обоих allиisnan каким - то образом, но не нашли способ еще.

@(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 < Infоценивается как ложное. Можно предположить, что все значения конечны, таким образом, проверяя, являются ли значения меньше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.


Следующее 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элементы из массива, где any?индексы расположены mapпо строкеFixnum s.

Образец прогона:

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

К5, 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), которые могут отсутствовать.

Два теста:

> 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, уничтожение - free()это то же самое, что сборщик мусора недалеко.

Массивы индексируются 1 в Lua, и я использую строку "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..}]&

Ввод [матрица в виде списка списков, вектор столбцов]


Добро пожаловать в Программирование Пазлов и Code Golf! :) Пожалуйста, исправьте форматирование и укажите формат ввода, включая индексацию столбцов в соответствии с заданием.
Денкер

0

Haskell, 39 байт

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

При этом используются индексы на основе 0. Пример использования (я использую sqrt(-1)для создания 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]]

Это просто простой фильтр, как видно из других ответов через понимание списка. Особый случай пустого списка индексов отлавливается отдельно.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.