Видаліть задані нечислові рядки


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

Піта, 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 an, значно покращивши алгоритм.

Update3: виправлена ​​помилка @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)

Пояснення

Очікує масив рядків у вигляді масивів та масив 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>


Гарне поводження з цим краєм корпусу!
Ніл

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 пед над рядком є Fixnums.

Проба зразка:

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

К5, 15 байт

Для цього використовуються стовпці, що індексуються 0, і природне представлення матриці списків K:

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

Індексуйте в матрицю ( x@) рядки, де ( &) не всі з ( ~&/') є null ( ^).

Дія:

  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. Оскільки масиви зовсім такі самі, як масиви С, ніхіляція схожа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

Математика, 52 51 49 46 байт

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

Введення - [матриця як список списків, вектор стовпців]


Ласкаво просимо до головоломки програмування та коду для гольфу! :) Будь ласка, виправте своє форматування та вкажіть свій формат введення, включаючи індексацію стовпців, як запитується у виклику.
Денкер

0

Хаскелл, 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.