ลบแถวที่ไม่ใช่ตัวเลขที่ระบุ


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

กฎและคำชี้แจง:

  • เมทริกซ์จะไม่ว่างเสมอ
  • ค่าตัวเลขจะ จำกัด แต่ไม่จำเป็นต้องเป็นจำนวนเต็มหรือค่าบวก
  • เวกเตอร์ดัชนีคอลัมน์สามารถว่างได้ (ซึ่งในกรณีนี้จะไม่มีการลบแถว)
  • ดัชนีคอลัมน์จะไม่มีค่าเกินขนาดเมทริกซ์
  • คุณสามารถสมมติว่าจะไม่มีการซ้ำซ้อนในรายการดัชนีคอลัมน์
  • คุณสามารถเลือกว่าคุณต้องการใช้ค่าศูนย์หรือหนึ่งดัชนี (โปรดระบุ)
  • คุณสามารถรับอินพุตในรูปแบบใดก็ได้ที่สะดวก
    • Array as list list เป็นปกติ ดัชนีคอลัมน์สามารถแยกอาร์กิวเมนต์
  • 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 และโดยการปรับปรุงอัลกอริทึมอย่างมีนัยสำคัญ

Update3:แก้ไขข้อบกพร่อง @ThomasKwa ที่ค้นพบ วิธีแก้ปัญหา 7 ไบต์ที่เสนอของเขาไม่ได้จัดการดัชนีคอลัมน์ที่ว่างเปล่าถูกต้องดังนั้นฉันจึงตรวจสอบกรณีที่มีสามส่วนที่นี่ ฉันไม่เห็นว่าฉันสามารถย่อ atm นี้ได้อย่างไร


1
คุณสามารถแทนที่Jด้วยvzและมีK ถูกเตรียมใช้งานกับอินพุตเพื่ออินพุตที่ถูกประเมิน QzQ
PurkkaKoodari

@ Pietu1998 ขอบคุณมาก! :) ฉันรู้ว่าฉันพลาดอะไรบางอย่างในเรื่องนั้น น่าเศร้าที่ฉันพบข้อผิดพลาดเมื่อฉันดูอีกครั้งเพื่อดำเนินการตามคำแนะนำของคุณซึ่งโดยรวมจะเพิ่มจำนวนไบต์ของฉันจนกว่าฉันจะพบโซลูชันที่ดีกว่า
Denker

1
?KEfnmklKm@TdKQQรายการที่ว่างเปล่าเป็นเท็จใน Pyth และคำสั่งการกำหนดค่าจะส่งคืนค่าที่กำหนดซึ่งจะบันทึกบางไบต์ ฉันหวังว่าคุณจะสนุกกับการเล่นกอล์ฟ Pyth! :)
FryAmTheEggman

@FryAmTheEggman ขอบคุณสำหรับคำแนะนำ ไม่เกี่ยวข้องอีกต่อไปแล้วตั้งแต่ฉันปรับปรุงอัลกอริทึมเป็นจำนวนมาก แต่ฉันซาบซึ้งในความช่วยเหลือ! :)
Denker

ดีมาก :) คุณสามารถบันทึกไบต์อื่นโดยใช้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>


การจัดการที่ดีของเคสขอบนั้น!
Neil

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

@DenkerAffe ประณามคงที่ค่าใช้จ่ายของ 5 ไบต์ ...
มาร์ตินเอนเดอร์

ฉันอยู่ที่นั่นด้วย ... คุณยังมีหนึ่งไบต์อยู่ข้างหน้าฉันดังนั้นแผนการของฉันจึงยังไม่ได้ผล: P
Denker

"อาร์เรย์ว่าง""" คุณหมายถึง "สตริงว่าง" หรือไม่
ETHproductions

@ETHproductions ไม่มีความแตกต่างใน CJam สตริงเป็นเพียงอาร์เรย์ของอักขระดังนั้น[]และ""เหมือนกันและการแทนแบบบัญญัติคือ""(เช่นเป็นสิ่งที่คุณได้รับเมื่อคุณสร้างสตริงว่าง)
Martin Ender

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))ส่งกลับอาร์เรย์ด้วย booleans สำหรับคอลัมน์ที่ระบุ ~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

K5, 15 ไบต์

สิ่งนี้ใช้คอลัมน์ที่จัดทำดัชนี 0 และการแสดงเมทริกซ์ list-of-list ตามธรรมชาติของ 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)

NaNNเป็นตัวแทนในการป้อนข้อมูลเป็น การจัดทำดัชนีเป็นแบบ 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

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

อินพุตคือ [เมทริกซ์เป็นรายการ, เวกเตอร์ของคอลัมน์]


ยินดีต้อนรับสู่ Programming Puzzles & Code Golf! :) โปรดแก้ไขการจัดรูปแบบของคุณและระบุรูปแบบการป้อนข้อมูลของคุณรวมถึงการจัดทำดัชนีคอลัมน์ตามที่ถามในการท้าทาย
Denker

0

Haskell, 39 ไบต์

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

สิ่งนี้ใช้ดัชนีที่อิง 0 ตัวอย่างการใช้งาน (ฉันใช้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.