ทำการคูณเมทริกซ์!


14

ในวิชาคณิตศาสตร์การคูณเมทริกซ์หรือผลิตภัณฑ์เมทริกซ์เป็นการดำเนินการแบบไบนารีที่สร้างเมทริกซ์จากสองเมทริกซ์ คำจำกัดความถูกกระตุ้นด้วยสมการเชิงเส้นและการแปลงเชิงเส้นบนเวกเตอร์ซึ่งมีการใช้งานมากมายในคณิตศาสตร์ประยุกต์ฟิสิกส์และวิศวกรรม รายละเอียดเพิ่มเติมหาก A คือเมทริกซ์ n × m และ B เป็นเมทริกซ์ m × p ผลิตภัณฑ์เมทริกซ์ AB ของพวกเขาคือเมทริกซ์× n ซึ่ง m รายการข้ามแถว A ถูกคูณด้วยรายการ m ลง a คอลัมน์ของ B และสรุปเพื่อสร้างรายการของ AB เมื่อการแปลงเชิงเส้นสองครั้งแสดงด้วยเมทริกซ์ดังนั้นผลิตภัณฑ์เมทริกซ์จะแสดงองค์ประกอบของการแปลงสองครั้ง

ที่มา: Wikipedia

กล่าวอีกนัยหนึ่งคือการคูณเมทริกซ์สองตัวอย่างเช่น:

1 2 3   1 4
2 3 4 × 3 1 = 
3 4 5   4 6

ก่อนจะแถวจำนวน 1 ในเมทริกซ์ครั้งแรกจำนวน 1 คอลัมน์ในเมทริกซ์ที่สองและคูณ1โดย1, 2โดย3และโดย34

1 × 1 = 1
2 × 3 = 6
3 × 4 = 12

ตอนนี้เพิ่มเข้าด้วยกันเพื่อรับรายการแรกของคุณ:

1 2 3   1 4   19
2 3 4 × 3 1 = 
3 4 5   4 6

สำหรับหมายเลขที่สองในคอลัมน์แรกของผลลัพธ์คุณจะต้องใช้หมายเลขแถว 2 แทนหมายเลขแถว 1 และทำสิ่งเดียวกัน

1 × 2 = 2
3 × 3 = 9
4 × 4 = 16
      = 27

หลังจากที่คุณทำทั้งคอลัมน์แรกผลลัพธ์จะเป็นดังนี้:

1 2 3   1 4   19
2 3 4 × 3 1 = 27
3 4 5   4 6   35

ตอนนี้ทำสิ่งเดียวกันซ้ำอีกครั้ง แต่นำคอลัมน์ที่สองมาแทนที่คอลัมน์แรกทำให้:

1 2 3   1 4   19 24
2 3 4 × 3 1 = 27 35
3 4 5   4 6   35 46

งานของคุณ

กำหนดเมทริกซ์สองตัว (ขนาดสูงสุด 200x200) ซึ่งมีตัวเลขอยู่ในช่วง -10000 ถึง 10,000 โดยที่จำนวนคอลัมน์ในคอลัมน์แรกเท่ากับจำนวนแถวในวินาทีคูณหนึ่งโดยหนึ่ง (การคูณเมทริกซ์ไม่ใช่แบบสลับ)

คุณอาจรับอินพุตและให้เอาต์พุตเป็นอาร์เรย์ของอาร์เรย์ (หรือเทียบเท่า), เมทริกซ์ (หากภาษาของคุณมีรูปแบบนั้น) หรือสตริงหลายบรรทัด

คุณไม่สามารถใช้บิวด์อินใด ๆ สำหรับการคูณเมทริกซ์

กรณีทดสอบ

1 2   1 2 3 4 5    13 16 19 22 25
3 4 × 6 7 8 9 10 = 27 34 41 48 55
5 6                41 52 63 74 85

2 3   3 5   15 13
3 4 × 3 1 = 21 19

5 3            11    27
1 3      1 3   7     15
9 3    × 2 4 = 15    39
1 -1000        -1999 -3997

จำไว้ว่านี่คือดังนั้นโค้ดที่มีจำนวนไบต์น้อยที่สุดจะเป็นผู้ชนะ


เราสามารถใช้ผลิตภัณฑ์ dot ในตัวได้หรือไม่? มันทำงานบนเวกเตอร์ไม่ใช่เมทริกซ์
เดนนิส

1
ลำดับการป้อนข้อมูลถูกแก้ไขหรือไม่หรือเราสามารถรับaและbตามลำดับและเอาท์พุทb × a ?
เดนนิส

@Dennis คุณสามารถย้อนกลับอินพุตได้ แต่ไม่มีผลิตภัณฑ์ dot
Oliver Ni

4
ความท้าทายเกี่ยวกับการทำ X โดยไม่ต้อง Yมีความท้อแท้
ข้อบกพร่อง

เมทริกซ์อินพุตสามารถมีเลขทศนิยมได้หรือไม่? ถ้าเป็นเช่นนั้นฉันขอแนะนำให้เพิ่มกรณีทดสอบกับบางกรณี
R. Kap

คำตอบ:


5

เยลลี่ , 7 5 ไบต์

Z×þḅ1

ใช้เวลาBและเป็นข้อโต้แย้งและผลตอบแทน× B

ลองออนไลน์!

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

Z×þḅ1  Main link. Left argument: B. Right argument: A

Z      Zip; transpose B's rows and columns.
 ×þ    Table multiplication; multiply all columns of B (rows of B's transpose) by
       all rows of A, element by element. Results are grouped by the rows of A.
   ḅ1  Unbase 1; compute the sum of all flat arrays in the result.

3
ดังนั้นในตัวและวิธีแบบแมนนวลเพื่อเพิ่มจำนวนเมทริกซ์ให้ได้จำนวนไบต์ในเยลลี่เท่ากันหรือไม่ มันช่างสับสน แต่เท่ห์
Yodle

@Yodle บิวด์อินæ×คือ 2 ไบต์
Erik the Outgolfer

@EriktheOutgolfer นั่นคือการอ้างอิงถึงการแก้ไข 2 ซึ่งใช้æ.อะตอม
Dennis

4

05AB1E , 13 ไบต์

vyU²øvyX*O})ˆ

ลองออนไลน์!

คำอธิบาย

v               # for each row in the first matrix
 yU             # save the row in X
   ²øv          # for each row in the transposition of the second matrix
      yX*       # multiply the rows
         O      # sum the elements of the resulting row
          }     # end inner loop
           )    # wrap elements of the new row in a list
            ˆ   # push to global list
                # implicitly output global list

สามารถเป็น 7 ไบต์ในขณะนี้ด้วยวิธีการเดียวกัน:εUøεX*O
Kevin Cruijssen

4

Python 2, 69 66 Bytes

นี่แค่ตามสูตรมาตรฐาน แต่แลมบ์ดา -d สำหรับความรัดกุม :) โค้ดที่ไม่ดีนั้นตรงไปตรงมามาก!

lambda x,y:[[sum(map(int.__mul__,r,c))for c in zip(*y)]for r in x]

ขอบคุณ Alexi Torhamo สำหรับการบันทึก 3 ไบต์! :)

รหัสไม่ได้รับการตอบกลับ:

x = [[1,2],[3,4],[5,6]]
y = [[1,2,3,4,5],[6,7,8,9,10]]

output = []
for row in x:
    nrow = []
    for col in zip(*y):                             # zip(*[]) transposes a matrix
        nrow += [sum(a*b for a,b in zip(row,col))]  # multiplication for each pair summed
    output += [nrow]

print output

คุณสามารถใช้sum(map(int.__mul__,r,c))เพื่อบันทึก 3 ไบต์ (จะไม่ทำงานกับจุดลอย แต่ก็ไม่จำเป็นเช่นกัน)
Aleksi Torhamo

3

J, 13 9 ไบต์

บันทึกแล้ว 4 ไบต์ด้วยไมล์!

[:+/*"#:~

นี่คือส้อมที่ต่อยอด:

[: +/ *"#:~

ซึ่งเทียบเท่ากับ:

[: +/ (*"#:)~
[: +/ (*"_ 1 0)~

ซึ่งทำการคูณที่ต้องการ เหล่านี้จะถูกรวมเข้าด้วยกัน

ด้วยผลิตภัณฑ์จุดในตัว 5 ไบต์: +/ .*

กรณีทดสอบ

   f =: [: +/ *"#:~
   (3 3$1 2 3 2 3 4 3 4 5)f(3 2$1 4 3 1 4 6)
19 24
27 35
35 46
   (3 3$1 2 3 2 3 4 3 4 5);(3 2$1 4 3 1 4 6)
+-----+---+
|1 2 3|1 4|
|2 3 4|3 1|
|3 4 5|4 6|
+-----+---+
   (2 2$2 3 3 4)f(2 2$3 5 3 1)
15 13
21 19
   (2 2$2 3 3 4);(2 2$3 5 3 1)
+---+---+
|2 3|3 5|
|3 4|3 1|
+---+---+

ฉันเพิ่งสะดุดไป[:+/*"#:~9 ไบต์
ไมล์

@miles ที่งดงาม!
Conor O'Brien



2

R, 66 ไบต์

function(A,B)apply(B,2,function(i)apply(A,1,function(j)sum(j*i)))

ฟังก์ชั่นที่ไม่ได้ตั้งชื่อโดยใช้เมทริกซ์ R สองตัวเป็นอินพุตและส่งคืนผลิตภัณฑ์ มันทำให้การใช้งานapplyที่ใช้ในการใช้ฟังก์ชั่นในช่วงระยะเวลาของอาร์เรย์ มันทำงานเป็นforวงคู่ในกรณีนี้: สำหรับแต่ละคอลัมน์ของBและสำหรับแต่ละแถวAให้ส่งคืนผลรวมของผลิตภัณฑ์ (vectorized)

เปรียบเทียบกับวิธี pure สำหรับ loop ( 101ไบต์):

function(A,B){M=matrix(NA,m<-nrow(A),n<-ncol(B));for(i in 1:n)for(j in 1:m)M[j,i]=sum(A[j,]*B[,i]);M}

ไม่ได้อยู่ที่เดสก์ท็อปของฉันในตอนนี้ แต่คุณไม่สามารถทำสิ่งที่ชอบouter(A,B,`*`)มากกว่าการapplyโทรแบบฝังตัวหรือไม่?
rturnbull

@rtbull ฉันไม่แน่ใจว่าการทำงานด้านนอกร่วมกับเมทริกซ์ แต่มันจะผลิตอาร์เรย์ 4 มิติในกรณีนี้
Billywob

อาใช่นั่นเป็นปัญหาเล็กน้อย การทำเมทริกซ์ให้เป็นเชิงเส้นมีแนวโน้มเป็นจำนวนไบต์มากกว่าวิธีการของคุณที่นี่
rturnbull

2

Mathematica ขนาด 20 ไบต์

Inner[1##&,##,Plus]&

ฟังก์ชั่นไม่ระบุชื่อ รับรายการลำดับที่ 2 จำนวนสองรายการเป็นอินพุตและส่งคืนรายการตัวเลขอันดับที่ 2 เป็นเอาต์พุต สำหรับคนที่อยากรู้อยากเห็นInnerมันเป็นฟังก์ชั่นที่ใช้แอพพลิเคชั่นที่เหมือนการคูณเมทริกซ์ของสองฟังก์ชั่นกับเทนเซอร์


ฉันเชื่อว่าInner[1##&,##]&เทียบเท่ากับInner[1##&,##,Plus]&... และ1##&~Inner~##&จะดียิ่งขึ้น
เกร็กมาร์ติ

2

C #, 168 167 ไบต์

(A,B)=>{int n=A.Length,p=B[0].Length,i=0,j=0,k=0,s;var R=new int[n,p];while(i++<n)for(j=0;j<p;){s=0;for(k=0;k<A[0].Length;)s+=A[i][k]*B[k++][j];R[i,j++]=s;}return R;};

ขอบคุณ @Mukul Kumar สำหรับการบันทึก 1 ไบต์ในขณะที่ loop จะสั้นลงในเวลานี้: P

โปรแกรมเต็มรูปแบบพร้อมกรณีทดสอบ:

using System;
class Matrix
{
    static void Main()
    {
        Func<int[][], int[][], int[,]> a = null;

        a = (A,B)=>
        {
            int n=A.Length,p=B[0].Length,i=0,j=0,k=0,s;
            var R=new int[n,p];
            while(i++<n)
                for(j=0;j<p;)
                {
                    s=0;
                    for(k=0;k<A[0].Length;)
                        s+=A[i][k]*B[k++][j];
                    R[i,j++]=s;
                }
            return R;
        };

        int[,] t1 = a(new int[][] { new int[] { 1, 2 }, new int[] { 3, 4 }, new int[] { 5, 6 } },
            new int[][] { new int[] { 1, 2, 3, 4, 5 }, new int[] { 6, 7, 8, 9, 10 } } );
        int[,] t2 = a(new int[][] { new int[] { 2, 3 }, new int[] { 3, 4 } },
            new int[][] { new int[] { 3, 5 }, new int[] { 3, 1 } });
        int[,] t3 = a(new int[][] { new int[] { 5, 3 }, new int[] { 1, 3 }, new int[] { 9, 3 }, new int[] { 1, -1000 } },
            new int[][] { new int[] { 1, 3 }, new int[] { 2, 4 } });

        Console.WriteLine(IsCorrect(t1, new int[,] { { 13, 16, 19, 22, 25 }, { 27, 34, 41, 48, 55 }, { 41, 52, 63, 74, 85 } } ));
        Console.WriteLine(IsCorrect(t2, new int[,] { { 15, 13 }, { 21, 19 } } ));
        Console.WriteLine(IsCorrect(t3, new int[,] { { 11, 27 }, { 7, 15 }, { 15, 39 }, { -1999, -3997 } } ));

        Console.Read();
    }

    static bool IsCorrect(int[,] answer, int[,] valid)
    {
        if (answer.Length != valid.Length)
            return false;
        for (int i = 0; i < answer.GetLength(0); i++)
            for (int j = 0; j < answer.GetLength(1); j++)
                if (answer[i, j] != valid[i, j])
                    return false;
        return true;
    }
}

คุณสามารถเล็มได้สองสามไบต์โดยใช้ลูปในขณะที่ ....
Mukul Kumar

@MukulKumar เดี๋ยวก่อนฉันไม่คิดอย่างนั้น อย่างมากที่สุดพวกเขาผิดพลาดใช่มั้ย for(;i<n;)-> while(i<n)มีขนาด 10 ไบต์
Yodle

1
for (;i <n;i++) -> while (i++<n)บันทึกได้ 1 ไบต์
Mukul Kumar

ไม่แน่ใจว่ามารยาทเมื่อฉันมีคำตอบที่ค่อนข้างแตกต่างกัน แต่ทางเลือกของฉันได้รับแรงบันดาลใจจากเรื่องนี้อย่างแน่นอน
Kirk Broadhurst

2

MATL , 12 11 ไบต์

7L&!*Xs6Be!

เมทริกซ์คืออินพุตที่ใช้;เป็นตัวคั่นแถว

ลองออนไลน์!

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


2

C ++ 14, 173 168 156 146 bytes

  • -5 ไบต์สำหรับการส่งคืนผ่านพารามิเตอร์อ้างอิง
  • -12 ไบต์สำหรับการใช้ foreach และC.back()แทนการนับบนi
  • -10 ไบต์สำหรับการปล่อยC.clear()และต้องCว่างเปล่าเมื่อเริ่มต้น

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

[](auto A,auto B,auto&C){int j,k,s=B[0].size();for(auto a:A){C.emplace_back(s);for(j=-1;++j<s;)for(k=-1;++k<B.size();C.back()[j]+=a[k]*B[k][j]);}}

ต้องการอินพุตและเอาต์พุตเป็นvector<vector<int>>และเอาต์พุตต้องว่างก่อน

Ungolfed:

auto f=
[](auto A, auto B, auto&C){
 int j,k,s=B[0].size();
 for (auto a:A){
  C.emplace_back(s);
  for (j=-1;++j<s;)
   for (k=-1;++k<B.size();
    C.back()[j]+=a[k]*B[k][j]
   );
 }
}
;

ตัวอย่าง:

int main() {
 using M=std::vector<std::vector<int>>;
 M a = {
  {1,2,3},
  {2,3,4},
  {3,4,5},
 };
 M b = {
  {1,4},
  {3,1},
  {4,6},
 };
 M c;
 f(a,b,c);
 for (auto&r:c){
  for (auto&i:r) std::cout << i << ", ";
  std::cout << "\n";
 }
}

ทำไมไม่ใช้push_back()แทนemplace_back()?
G. Sliepen

2

Husk , 7 6 ไบต์

mMδṁ*T

โปรดทราบคำสั่งโต้แย้งลองออนไลน์!

-1 ไบต์ขอบคุณ @Zgarb!

คำอธิบาย

เพียงแค่ทำตามนิยามของ matrix-multiplication sais:

mMδṁ*T  -- takes arguments in reverse order, eg: [[1],[0],[-1]] [[1,2,3],[4,5,6]]
     T  -- transpose the first argument: [[1,0,-1]] [[1,2,3],[4,5,6]]
m       -- map the following function (example element [1,0,-1])
 M      --   map the following function applied to [1,0,-1] (example element [1,2,3])
  δṁ    --     accumulate a sum of element-wise..
    *    --    ..multiplication: -2
          -- [[-2],[-2]]

1
oΣzสามารถδṁ
Zgarb


1

C #, 131 ไบต์

(A,B)=>new List<List<int>>(A.Select(x=>new List<int>
    (B[0].Select((f,i)=>B.Select(r=>r[i])).Select(y=>x.Zip(y,(p,q)=>p*q).Sum()))));

ฉันขโมยโซลูชันของ Yodleโดยมีข้อสันนิษฐานว่าฉันสามารถเขียนได้อย่างมีประสิทธิภาพมากขึ้นโดยใช้ LINQ (ตรงข้ามกับลูป) ใช้ความพยายามไม่กี่ครั้ง แต่กระทืบมันลงบ้าง

ที่นี่มันถูกทำลายลงบ้าง:

a = (A, B) => new List<List<int>>(
            from x in A
            select new List<int>(
                from y in B.First().Select((f, i) => B.Select(r => r.ElementAt(i)))
                select x.Zip(y, (p, q) => p * q).Sum()));

'เคล็ดลับ' ของจริงเท่านั้นที่นี่คือเมทริกทรานสB.First().Select((f, i) => B.Select(r => r.ElementAt(i)))โพส เมื่อเราไขว้เมทริกซ์ที่สองเรามีสองอาร์เรย์และA[i,x] B[j,x]นำผลิตภัณฑ์คาร์ทีเซียน ( i*j) และซิปแต่ละxแถวความยาวเข้าด้วยกัน

รหัสทดสอบ:

using System;
class Matrix
{
    static void Main()
    {
        Func<int[][], int[][], List<List<int>>> a = null;
        a = (A, B) => new List<List<int>>(A.Select(x => new List<int>(B[0].Select((f, i) => B.Select(r => r[i])).Select(y => x.Zip(y, (p, q) => p * q).Sum()))));

        List<List<int>> t1 = a(new int[][] { new int[] { 1, 2 }, new int[] { 3, 4 }, new int[] { 5, 6 } },
            new int[][] { new int[] { 1, 2, 3, 4, 5 }, new int[] { 6, 7, 8, 9, 10 } });
        List<List<int>> t2 = a(new int[][] { new int[] { 2, 3 }, new int[] { 3, 4 } },
            new int[][] { new int[] { 3, 5 }, new int[] { 3, 1 } });
        List<List<int>> t3 = a(new int[][] { new int[] { 5, 3 }, new int[] { 1, 3 }, new int[] { 9, 3 }, new int[] { 1, -1000 } },
            new int[][] { new int[] { 1, 3 }, new int[] { 2, 4 } });

        Console.WriteLine(IsCorrect(t1, new int[,] { { 13, 16, 19, 22, 25 }, { 27, 34, 41, 48, 55 }, { 41, 52, 63, 74, 85 } }));
        Console.WriteLine(IsCorrect(t2, new int[,] { { 15, 13 }, { 21, 19 } }));
        Console.WriteLine(IsCorrect(t3, new int[,] { { 11, 27 }, { 7, 15 }, { 15, 39 }, { -1999, -3997 } }));

        Console.Read();
    }

    static bool IsCorrect(List<List<int>> answer, int[,] valid)
    {
        if (answer.Count*answer[0].Count != valid.Length)
            return false;
        for (int i = 0; i < answer.Count; i++)
            for (int j = 0; j < answer[0].Count; j++)
                if (answer[i][j] != valid[i, j])
                    return false;
        return true;
    }

}

นิสัยดี: P ฉันไม่เคยใช้ Linq มากขนาดนั้นดังนั้นฉันจึงไม่ได้ตระหนักถึงความสามารถทั้งหมดของมันดังนั้นฉันจึงมักจะใช้ลูปและอุปกรณ์มาตรฐาน อย่างไรก็ตามฉันคิดว่าคุณต้องรวมการใช้ System.Linq; บรรทัดในการนับไบต์ของคุณไม่แน่ใจว่ามีผลกระทบมากแค่ไหน
Yodle

@Yodle ใช่ฉันจะต้องรวมusing System.Linq; ฉันไม่แน่ใจว่าวิธีแก้ปัญหาที่นี่จำเป็นต้องมีส่วนที่ต้องการusing Systemและstatic void Main()
Kirk Broadhurst

ฉันได้รับคำตอบสำหรับตอนนี้และจากสิ่งที่ฉันได้เห็นโดยทั่วไปคำตอบของคุณ (สิ่งที่คุณรวมถึงในจำนวนไบต์ของคุณ) จะต้องทำงานถ้าคุณเพิ่งวางลงในโปรแกรม สำหรับ C # โดยเฉพาะถ้าคุณกำลังเขียนแค่ฟังก์ชั่นคุณก็ไม่จำเป็นต้องใส่คำจำกัดความของคลาสหรือสิ่งที่เป็นโมฆะแบบสแตติก Main () แต่ถ้าวิธีการแก้ปัญหาของคุณใช้สิ่งใดในไลบรารีเช่น Console.WriteLine () System.Console.WriteLine () หรือใช้ระบบ; เนื่องจากอาจสั้นกว่านี้
Yodle

1

Haskell , 49 ไบต์

z=zipWith
m a=map(\x->foldr1(z(+))$z(map.(*))x a)

ลองออนไลน์!

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

ฉันรู้สึกว่าต้องเป็นวิธีที่ดีในการทำให้จุดนี้เป็นอิสระและบันทึกจำนวนหนึ่งไบต์ แต่ฉันยังไม่เห็นมัน


0

Javascript, 128 ไบต์

m=(a,b)=>{$=[];q=0;for(x in b){c=[];j=0;for(y in a[0]){_=i=0;for(z in b[0]){_+=a[i][j]*b[q][i];i++}c.push(_);j++}$.push(c);q++}}

คุณได้รับผลเพียงแค่ตรวจสอบ $ - มันเป็นการโกง แต่เดี๋ยวก่อนมันบันทึกไม่กี่ไบต์


0

PHP, 110 ไบต์

function f($a,$b){foreach($a as$n=>$x)foreach($b as$m=>$y)foreach($y as$p=>$v)$z[$n][$p]+=$v*$x[$m];return$z;}

สามลูปสำหรับอาร์เรย์พราย นี่เป็นสิ่งที่ตรงไปตรงมา ... แต่มันไม่ค่อยมีกอล์ฟ


0

จริงแล้ว 14 ไบต์

ยินดีต้อนรับคำแนะนำการเล่นกอล์ฟ! ลองออนไลน์!

┬@;l)∙`i♀*Σ`M╡

Ungolfing

         Implicit input A, then B.
┬        Transpose B's rows and columns. Call it B_T.
@        Swap A to TOS.
;l)      Get len(A) and move to BOS for later.
∙        Push the Cartesian product of A and B_T. Call it cart_prod.
`...`M   Map the following function over cart_prod. Variable xs.
  i        Flatten xs onto the stack, getting a row of A and column of B.
  ♀*       Multiply each element of A_row by each element of B_column.
  Σ        Sum the resulting list to get an element of A*B.
         The result of the map returns every element of A*B, but in one flat list.
╡        Push a list containing len(A) non-overlapping sublists of A*B.
         This separates A*B into rows.
         Implicit return.

0

C, 618 ไบต์

M(char*a,char*b){char*P[2];P[0]=malloc(strlen(a));P[1]=malloc(strlen(b));for(int A=0;A<strlen(a);A++){P[0][A]=a[A];};for(int B=0;B<strlen(b);B++){P[1][B]=b[B];};int H[200][200],B[200][200];int O,N,m,J;for(int Y=0;Y<2;Y++){int y=0,z=0,r=0;char j[7];int p=strlen(P[Y]);for(int i=0;i<=p;i++){if(P[Y][i]==' '||P[Y][i]==','||i==p){(Y<1)?H[y][z]=atoi(j):(B[y][z]=atoi(j));memset(j,'\0',4);(P[Y][i]==' ')?z++:y++;z=(P[Y][i]==',')?0:z;r=0;}else{j[r]=P[Y][i];r++;};};(Y<1)?O=z+1,N=y:(m=y,J=z+1);};for(int U=0;U<N;U++){for(int F=0;F<J;F++){int T=0;for(int d=0;d<O;d++){T+=H[U][d]*B[d][F];};printf("%d ",T);T=0;};printf("\n");};}

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

ตอนนี้ด้วยวิธีนี้จะรับอินพุตผ่านบรรทัดคำสั่งด้วยเมทริกซ์สองตัวที่แทนด้วยสองสตริงโดยแต่ละอันมีแถวที่คั่นด้วยเครื่องหมายจุลภาคและแต่ละแถวแทนด้วยจำนวนเต็มคั่นด้วยช่องว่าง ตัวอย่างเช่นเมทริกซ์:

   1 2 3     44 52
A= 4 5 6  B= 67 -79
   7 8 9     83 90

จะป้อนเป็น:

./a.out "1 2 3,4 5 6,7 8 9" "44 52,67 -79,83 90"

เมทริกซ์ที่ได้จะถูกส่งออกไปยัง STDOUT เป็นสตริงหลายบรรทัด ตัวอย่างเช่นเอาต์พุตสำหรับอินพุตด้านบนจะเป็น:

 427 164 
1009 353 
1591 542 

TIO 539 ไบต์
girobuz

0

Clojure 60 ไบต์

#(for[a %](for[b(apply map vector %2)](apply +(map * a b))))

ไบต์จำนวนมากใช้ในการโอนอาร์กิวเมนต์ที่ 2


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