Usuń określone wiersze nienumeryczne

16

W przypadku jakichkolwiek wątpliwości: Nan = Non-numeric datatypena potrzeby tego wyzwania.


Napisz program lub funkcję, która pobiera macierz / tablicę jako dane wejściowe, a także listę indeksów kolumn.

Wyzwanie polega na usunięciu wierszy, w których znajdują się wszystkie elementy w określonych kolumnach Nan. Nie ma znaczenia, czy inne elementy w wierszu są numeryczne, czy nie. Poniższe przykłady, mam nadzieję, wyjaśnią to (ma jeden indeks):

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

Zasady i wyjaśnienia:

  • Matryca zawsze będzie niepusta
  • Wartości liczbowe będą skończone, ale niekoniecznie liczby całkowite lub wartości dodatnie
  • Wektor indeksu kolumny może być pusty (w którym to przypadku wiersze nie zostaną usunięte)
  • Indeks kolumny nigdy nie będzie miał wartości przekraczających wymiary macierzy
  • Możesz założyć, że na liście indeksów kolumn nie będzie duplikatów
  • Możesz wybrać, czy chcesz używać wartości zerowych czy indeksowanych (proszę określić)
  • Możesz pobrać dane wejściowe w dowolnym dogodnym formacie
    • Tablica jako lista list jest OK. Indeksy kolumn mogą być osobnymi argumentami
  • ans = i podobne są akceptowane w wyniku
  • Masz swobodę wyboru, jakiego typu nieliczbowego typu danych chcesz użyć
    • Wykonanie operacji arytmetycznych na tym typie danych lub konwersja go na liczbę skończoną przy użyciu funkcji takich jak np float(x). Powinno być niemożliwe .

To jest kod golfowy, więc wygrywa najkrótszy kod w bajtach.

Stewie Griffin
źródło

Odpowiedzi:

6

Pyth, 16 19 10 9 7 10 Bajtów

Indeksy kolumn zaczynają się od zera. Dane wejściowe to lista list. Używa pustego ciągu jako wartości nienumerycznej. Pobiera listę indeksów kolumn w pierwszym wierszu i macierz z wartościami w drugim wierszu.

?Qf-QxkTEE

Wypróbuj online!

Wyjaśnienie

?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

Aktualizacja: Moje pierwsze rozwiązanie źle obsługiwało pustą listę indeksów kolumn. Naprawiono (dość brzydko) kosztem 3 bajtów. Spróbuję zrobić to lepiej po pracy ...

Aktualizacja 2: Gra w golfa do 10 9 7 bajtów, z pewną pomocą @FryAmTheEggman i poprzez znaczną poprawę algorytmu.

Aktualizacja 3: Naprawiono błąd wykryty przez ThomasaKwa. Jego zaproponowane rozwiązanie 7-bajtowe nie radziło sobie dobrze z pustymi indeksami kolumn, więc po prostu łapię ten przypadek za pomocą trójki. Nie rozumiem, jak mogę skrócić ten bankomat.

Denker
źródło
1
Można wymienić Jz vzi Kz Q. zjest inicjowany do wprowadzania, Qdo oceny danych wejściowych.
PurkkaKoodari
@ Pietu1998 Wielkie dzięki! :) Wiedziałem, że czegoś mi brakuje w tym względzie. Niestety, znalazłem błąd, gdy spojrzałem na niego ponownie, aby wdrożyć twoją sugestię, która ogólnie zwiększa moją liczbę bajtów, dopóki nie znajdę lepszego rozwiązania.
Denker
1
?KEfnmklKm@TdKQQpuste listy są fałszywe w Pyth, a instrukcje przypisania zwracają przypisaną wartość, co oszczędza niektóre bajty. Mam nadzieję, że lubisz grać w golfa w Pyth! :)
FryAmTheEggman
@FryAmTheEggman Dzięki za sugestie. Nie jest już tak naprawdę istotny, ponieważ znacznie poprawiłem algorytm, ale naprawdę doceniam pomoc! :)
Denker
Bardzo fajnie :) możesz zapisać kolejny bajt za pomocą L->fnks@LTQE
FryAmTheEggman
6

JavaScript (ES6), 48 46 bajtów

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

Wyjaśnienie

Oczekuje, że tablica wierszy będzie tablicami, a tablica liczb o indeksie 0 będzie sprawdzana dla kolumn. Zwraca tablicę tablic.

Prosto filteri some. Sprawdza za NaNpomocą n < Infinity( truedla liczb skończonych, falsedla 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>

użytkownik 81655
źródło
Dobra obsługa tej skrzynki krawędzi!
Neil
3

CJam, 18 bajtów

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

Nienazwany blok (funkcja) oczekujący macierzy i liczonych od zera indeksów kolumn na stosie (macierz na górze), który pozostawia filtrowaną macierz na stosie. Używam pustej tablicy ""jako wartości nienumerycznej.

Sprawdź to tutaj.

Wyjaśnienie

{     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.
Martin Ender
źródło
Czy testuję to źle, czy to narusza zasadę braku danych indeksów kolumn? The column index vector can be empty (in which case no rows will be removed)
Denker
@DenkerAffe Damn, naprawiony kosztem 5 bajtów ...
Martin Ender
Też tam byłem ... Ciągle jeszcze jeden bajt przede mną, więc mój plan jeszcze się nie sprawdził: P
Denker
„pusta tablica ""” Czy chodziło Ci o „pusty ciąg”?
ETHprodukcje
@ETHproductions Nie ma różnicy w CJam. Struny są tylko tablice znaków, tak []i ""są identyczne i reprezentacja jest kanoniczna ""(np to, co dostajesz, kiedy stringify pustą tablicę).
Martin Ender
3

APL, 19 bajtów

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

Lewy argument powinien być listą indeksów (i musi być listą, a nie skalarem), prawy argument to macierz. APL ma dwa typy danych, liczby i znaki, więc odfiltrowuje typy znaków.

Testy:

      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

Wyjaśnienie:

  • ⍵[;⍺]: wybierz dane kolumny z macierzy
  • 0↑¨: weź pierwsze 0elementy od początku każdego elementu
  • ⍬∘≡¨: porównaj z numeryczną pustą listą
  • ∨/: sprawdź, w którym wierszu pasuje co najmniej jeden element
  • ⍵⌿⍨: wybierz te wiersze z matrycy
marinus
źródło
2

MATLAB, 32 28 bajtów

Odpowiem raz na moje własne pytanie. Najlepsze, co mogę zrobić w MATLAB, to 28 bajtów. Miałem nadzieję, że uniknę ich użycia alli isnanjakoś, ale jeszcze nie znalazłem sposobu.

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

Test:

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

Jest to anonimowa anonimowa funkcja, która przyjmuje macierz wejściową jako pierwszą zmienną wejściową, a listę indeksów kolumn jako drugą.

W MATLAB, NaN < Infocenia na false. Można założyć, że wszystkie wartości są skończone, dlatego sprawdzenie, czy wartości są mniejsze niż, infjest równoważne sprawdzeniu, czy są one nienumeryczne. any(...,2)sprawdza, czy istnieją jakieś prawdziwe wartości wzdłuż drugiego wymiaru (wierszy). W takim przypadku wiersze zostaną zwrócone.

Stara wersja:

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

isnan(A(:,c))zwraca tablicę z wartościami logicznymi dla określonych kolumn. ~all(isnan(A(:,c)),2)sprawdza, czy wszystkie wartości wzdłuż drugiego wymiaru (wierszy) są nienumeryczne, i neguje je. W wyniku tego powstaje wektor boolowski z pozycjami, które chcemy zachować. A(~all(isnan(A(:,c)),2),:)używa indeksowania logicznego, aby wyodrębnić całe wiersze A.


Poniższe 24-bajtowe rozwiązanie działałoby, gdyby zagwarantowano, że wartości będą niezerowe:

@(A,c)A(any(A(:,c),2),:)
Stewie Griffin
źródło
2

Rubinowy, 48 bajtów

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

Dane wejściowe oparte są na indeksach 0 1 .

Właściwie dość oczywiste. selectelementy z tablicy, gdzie any?indeksy mapped nad wierszem są Fixnums.

Przykładowy przebieg:

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: W końcu poprawnie napisałem to słowo przy pierwszej próbie! \ o /

Klamka
źródło
2

K5, 15 bajtów

Wykorzystuje to kolumny z indeksowaniem 0 i naturalną reprezentację macierzy K list:

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

Indeksuj w macierzy ( x@) wiersze, w których ( &) nie wszystkie z nich ( ~&/') mają wartość null ( ^).

W akcji:

  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)
JohnE
źródło
2

MATL , 15 16 bajtów

tiZ)tn?ZN!XA~Y)

NaNjest reprezentowany na wejściu jako N. Indeksowanie jest oparte na 1. Na przykład w pierwszym przypadku testowym wejściem jest

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

Wypróbuj online!

Wyjaśnienie

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
Luis Mendo
źródło
2

R, 49 bajtów

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

Dane wejściowe są oparte na 1. Funkcja przyjmuje macierz ( m) i wektor indeksów kolumn (j ), których może brakować.

Dwa przypadki testowe:

> 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
docendo discimus
źródło
0

Lua, 148 bajtów

Funkcja, która pobiera macierz i tablicę jako dane wejściowe i wyprowadza macierz z odpowiednimi wierszami w nil. Ponieważ tablice są dość takie same jak tablice C, nihilowanie jest podobne do free()tego, ponieważ śmieciarz nie jest daleko.

Tablice są w indeksie 1 indeksowane w Lua i używam łańcucha "NaN"jako elementu niebędącego nomerem.

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

Możesz wypróbować Lua online i skopiować / wkleić następujący przykładowy kod, aby wypróbować to zgłoszenie:

-- 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
Katenkyo
źródło
0

Mathematica, 52 51 49 46 bajtów

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

Dane wejściowe to [macierz jako lista list, wektor kolumn]

Simmons
źródło
Witamy w Programowaniu Puzzle i Code Golf! :) Popraw formatowanie i określ format wejściowy, w tym indeksowanie kolumn zgodnie z pytaniem w wyzwaniu.
Denker
0

Haskell, 39 bajtów

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

Korzysta z indeksów opartych na 0. Przykład użycia (używam sqrt(-1)do tworzenia 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]]

Jest to po prostu prosty filtr, jak widać w innych odpowiedziach poprzez zrozumienie listy. Szczególny przypadek pustej listy indeksów jest wychwytywany osobno.

nimi
źródło