ผลรวมคอลัมน์ฉลาด


30

รับรายการที่ไม่มีตัวเลขของแถวที่ไม่มีตัวเลขให้คำนวณผลรวมคอลัมน์ที่ชาญฉลาดซึ่งเป็นรายการอื่นที่มีความยาวของแถวที่ยาวที่สุด รายการแรกของรายการผลลัพธ์คือผลรวมของรายการแรกทั้งหมดของแถวอินพุตส่วนที่สองคือผลรวมขององค์ประกอบที่สองทั้งหมด (ถ้ามี) เป็นต้นฉันคิดว่าตัวอย่างต่อไปนี้จะอธิบายได้ดีกว่า:

Input:      {[1,2,3,4],[1],[5,2,3],[6,1]}
Computation: [1,2,3,4]
              + . . .
             [1]. . .
              + + + .
             [5,2,3].
              + + . .
             [6,1]. .
              = = = =
    Output: [13,5,6,4]

กรณีทดสอบ

{[0]}                         -> 0
{[1],[1,1,1,1]}               -> [2,1,1,1]
{[1],[1,2],[1,2,3],[1,2,3,4]} -> [4,6,6,4]
{[1,6,2,-6],[-1,2,3,5]}       -> [0,8,5,-1]

อาร์เรย์จะมีจำนวนเต็มเท่านั้นหรือไม่
ETHproductions

ฉันไม่ได้คิดถึงเรื่องนั้นจนถึงตอนนี้ แต่ฉันคิดว่าคุณสามารถคิดได้ มีอะไรที่ขัดแย้งกับเรื่องนี้เหรอ?
ข้อบกพร่อง

ฉันไม่คิดอย่างนั้น กรณีทดสอบทั้งหมดของคุณใช้จำนวนเต็มเท่านั้นและฉันค่อนข้างแน่ใจว่าจะไม่ทำให้คำตอบที่มีอยู่ (และอาจบันทึกไบต์สำหรับคำตอบบางคำ)
ETHproductions

ถ้าอย่างนั้นฉันคิดว่าสมมติฐานนี้เป็นที่ยอมรับอย่างสมบูรณ์ มันไม่เปลี่ยนความท้าทายด้วยตัวเอง
ข้อบกพร่อง

คำตอบ:


19

เยลลี่ขนาด 1 ไบต์

S

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

มันทำงานอย่างไร

ผลรวมอะตอมSเป็นแบบย่อสำหรับ+/ซึ่งจะดำเนินการลดลงโดยการเพิ่ม

การ/ลดอย่างรวดเร็วตามมิติด้านนอกสุดดังนั้นมันจึงเรียกลิงก์สำหรับองค์ประกอบของอินพุต ที่นี่องค์ประกอบคือแถว

อะตอมเพิ่มเติม+vectorizes ดังนั้นการเพิ่มเวกเตอร์สองแถวทำการเพิ่มองค์ประกอบโดยองค์ประกอบ เมื่ออาร์กิวเมนต์มีความยาวต่างกันองค์ประกอบของอาร์กิวเมนต์ที่ยาวกว่าที่ไม่มีคู่ในอันที่สั้นกว่านั้นจะไม่ถูกเปลี่ยนแปลง

สรุปด้วยเมทริกซ์ที่ผิดปกติเป็นอาร์กิวเมนต์Sคำนวณผลรวมคอลัมน์ที่ฉลาดข้ามรายการที่ขาดหายไปในแถวที่สั้นกว่า


1
อืมฉันคาดหวังว่าจะเป็นผลรวมของแถวอย่างชาญฉลาดเนื่องจากวิธีการที่ autovectorisation ทำงานตามปกติในเยลลี่ ฉันจะเอาผลรวมแถวที่ชาญฉลาดS€แล้วถ้าอย่างนั้นมา?

1
สำหรับอาร์เรย์ 2D ใช่ /ไม่ทำให้เป็นแบบเวกเตอร์ มันเพียงแค่ใช้ dyad ที่สอดคล้องกับองค์ประกอบทั้งหมดของการโต้แย้ง
เดนนิส





8

CJam , 7 5 ไบต์

ลดลง 2 ไบต์ขอบคุณเดนนิส!

{:.+}

สิ่งนี้จะกำหนดบล็อกที่ไม่ระบุชื่อที่ใช้รายการของรายการเช่น[[1 2 3 4] [1] [5 2 3] [6 1]]และแทนที่ด้วยรายการ[13 5 6 4]และแทนที่มันด้วยรายการ

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย

{   }   e# Define block
 :      e# Fold over the following dyadic function
  .+    e# Vectorized addition

7

MATL , 3 ไบต์

oXs

( MATL ไม่รู้ว่าพหูพจน์ของ "วัว" คือ "วัว" ... )

อินพุตเป็นอาร์เรย์เซลล์ของเวกเตอร์แถวตัวเลขในรูปแบบเดียวกับข้อความท้าทาย:

{[1,2,3,4],[1],[5,2,3],[6,1]}

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

     % Implicit input
o    % Convert cell array to a matrix, right-padding with zeros each row
Xs   % Sum of each column
     % Implicit display

ฉลาดมากในการใช้เซลล์ =)
ข้อผิดพลาด

4

JavaScript (ES6), 51 48 ไบต์

บันทึกแล้ว 3 ไบต์ขอบคุณ ETHproductions

a=>a.map(b=>b.map((v,i)=>r[i]=~~r[i]+v),r=[])&&r

กรณีทดสอบ


มีอะไรผิดปกติกับreduce? a=>a.reduce((l,r)=>r.map((e,i)=>e+(l[i]||0)))มีเพียง 45 ไบต์
Neil

@Neil นั่นจะไม่ จำกัด ขนาดของผลลัพธ์สุดท้ายเป็นขนาดของอาร์เรย์ที่ประมวลผลครั้งสุดท้ายใช่ไหม
Arnauld

อากรณีทดสอบล้มเหลวในการตรวจจับข้อผิดพลาดของฉันขอบคุณ!
Neil


3

C ++ 14, 130 ไบต์

ในฐานะแลมบ์ดาทั่วไปที่ไม่มีชื่อ:

[](auto C,auto&r){r.clear();int i=0,b=1;while(b--){r.push_back(0);for(auto c:C)r.back()+=i<c.size()?c[b=1,i]:0;++i;}r.pop_back();}

ต้องCเป็นเหมือนvector<vector<int>>และส่งคืนค่าrเป็นเหมือนvector<int>(ควรเป็นไปตามเมตาดาต้า )

Ungolfed & การใช้งาน:

#include<vector>
#include<iostream>

auto f=
[](auto C, auto&r){
 r.clear();         //clearing r just to be sure
 int i=0,b=1;       //i is the position in the row, b is a boolean
 while(b--){        //while something was added
  r.push_back(0);   //add zero
  for(auto c:C)     //for each container
   r.back() += i<c.size() ?   //add to the last element 
    c[b=1,i] : 0;             //set b and get the element or zero 
  ++i;              
 }
 r.pop_back();      //remove last unnecessary zero
}
;

using namespace std;

int main(){
 vector<vector<int> > C = { {1,2,3,4}, {1}, {5,2,3}, {6,1} };
 vector<int> r; 
 f(C,r);
 for (int i: r)
  cout << i << ", ";
 cout << endl;
}


3

Haskell, 61 41 40 ไบต์

ขอบคุณ @Laikoni สำหรับ -20 ไบต์, @nimi สำหรับ -1 ไบต์!

f[]=[]
f l=sum[h|h:_<-l]:f[t:u|_:t:u<-l]

คำอธิบาย:มันเป็นเพียงการสรุปซ้ำขององค์ประกอบแรกของรายการรวมถึงการจัดการกับรายการที่ว่างเปล่าในทุกขั้นตอนกลาง:

    sum[h|h:_<-l]                    -- sums up all the first elemetns of the list
                    [t:u|_:t:u<-l]   -- removes the first element of all the list, and removes empty lists
                   f                 -- applies f to the remaining list
                 :                   -- prepends the sum to the rest

ใช้ comprehensions รายการบันทึกค่อนข้างไบต์บาง: คุณสามารถแทนที่(sum$sum.(take 1)<$>l)ด้วยsum[h|h:_<-l]และมี(f$filter(/=[])$drop 1<$>l) f[t|_:t<-l,t>[]]
Laikoni

ว้าวขอบคุณมาก! ฉันลืมเกี่ยวกับความเป็นไปได้ของการจับคู่รูปแบบใน[h|h:_<-l]!
ข้อบกพร่อง

หนึ่งไบต์จะถูกบันทึกไว้ในโทร f[t:u|_:t:u<-l]recursive:
nimi

2

J, 5 ไบต์

+/@:>

รับอินพุตเป็นรายการของชนิดบรรจุกล่อง

กรณีทดสอบ

   1 ; 1 1 1 1
+-+-------+
|1|1 1 1 1|
+-+-------+
   (+/@:>) 1 ; 1 1 1 1
2 1 1 1
   1 ; 1 2 ; 1 2 3 ; 1 2 3 4
+-+---+-----+-------+
|1|1 2|1 2 3|1 2 3 4|
+-+---+-----+-------+
   (+/@:>) 1 ; 1 2 ; 1 2 3 ; 1 2 3 4
4 6 6 4

2

Dyalog APL ขนาด 3 ไบต์

+⌿↑

+⌿ ผลรวมคอลัมน์ฉลาด

อาร์กิวเมนต์แบบผสม (รายการ, สแต็กเป็นเมทริกซ์, การเติมด้วยค่าศูนย์)

ลองใช้ออนไลน์!


2
ขนาด 10 ไบต์บนโลกนี้เป็นอย่างไร
Zacharý

3
@ZacharyT นั่นคือสิ่งที่เกิดขึ้นเมื่อใช้เทมเพลตเวลา 12:30 น.
อดัม


1

Java 8, 124 ไบต์

นี่คือการแสดงออกแลมบ์ดาสำหรับ Function< int[ ][ ], int[ ] >

i->{int L=0,t,r[];for(int[]a:i)L=(t=a.length)>L?t:L;r=new int[L];for(;0>L--;)for(int[]a:i)r[L]+=a.length>L?a[L]:0;return r;}

ใช้ความยาวอาร์เรย์ที่ใหญ่ที่สุดจากอินพุตสร้างอาร์เรย์ใหม่ของขนาดนั้นแล้วเขียนผลรวมของแต่ละคอลัมน์ไปยังอาร์เรย์



1

R, 105 97 ไบต์

a=c();l=length;for(i in 1:l(w)){length(w[[i]])=max(sapply(w,l));a=rbind(a,w[[i]])};colSums(a,n=T)

สิ่งนี้ใช้ในการป้อนlistวัตถุที่เรียกว่าwในรูปแบบ:

w=list(c(1,2,3,4),c(1),c(1,2))

มันแสดงผลรวมคอลัมน์ฉลาด: [1] 3 4 3 4

ทางออกนี้ค่อนข้างยาวสำหรับฉัน Rมีลักษณะเฉพาะในการรีไซเคิลเมื่อคุณพยายามผูกเวกเตอร์ที่มีความยาวต่างกัน ตัวอย่างเช่น :

a=c(1,2,3,4)
b=c(1,2)

cbind(a,b)

     a b
[1,] 1 1
[2,] 2 2
[3,] 3 1
[4,] 4 2

b ถูกนำมาใช้อีกครั้งเพื่อให้พอดีซึ่งเป็นเหตุผลที่ฉันเริ่มต้นด้วยรายการ

โปรแกรมปรับความยาวขององค์ประกอบทั้งหมดของรายการเป็นหนึ่งในรายการที่ยาวที่สุดผูกองค์ประกอบและคำนวณผลรวมคอลัมน์ที่ชาญฉลาด ความยาวของการปรับการผลิตNAนั้นจะถูกละเว้นโดยsum.

-8 ไบต์ขอบคุณ @Jarko Dubbeldam!


colSums(a,na.rm=T)บันทึกไม่กี่ไบต์
JAD

และคุณยังสามารถเปิดเข้าไปna.rm=T n=T
JAD

1

PHP, 63 ไบต์

<?foreach($_GETas$a)foreach($a as$i=>$x)$r[$i]+=$x;print_r($r);

โทรในเบราว์เซอร์ที่มีพารามิเตอร์ GET เป็นรายการอินพุต

ตัวอย่าง:
script.php?a[]=1&a[]=2&a[]=3&a[]=4&b[]=1&c[]=5&c[]=2&c[]=3&d[]=6&d[]=1
(ชื่ออาร์เรย์จะถูกละเว้นดังนั้นคุณจึงสามารถตั้งชื่อได้ตามที่คุณต้องการ)

ลองใช้ฟังก์ชั่นนี้เพื่อทดสอบ:

function s($a){foreach($a as$b)foreach($b as$i=>$x)$r[$i]+=$x;return$r;}

หรือใช้http_build_query($array,a)เพื่อแปลงอาร์เรย์ของอาร์เรย์ให้เป็นพารามิเตอร์ GET



0

Japt, 5 ไบต์

Uz mx

ทดสอบออนไลน์!

Uคืออาร์เรย์อินพุตและzในอาร์เรย์จะหมุนตามเข็มนาฬิกาไป 90 องศา ดังนั้น,

[
 [1,2,3,4],
 [1      ],
 [5,2,3  ],
 [6,1    ]
]

กลายเป็น

[
 [6,5,1,1],
 [1,2,  2],
 [  3,  3],
 [      4]
]

(เพิ่มระยะห่างเฉพาะเพื่อการแสดงผล)

mxจากนั้นmaps โดย summation ( x) ซึ่งให้ผลลัพธ์ที่ต้องการ: [13,5,6,4].

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.