ค้นหาพลังเมทริกซ์


9

ปัญหา

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

ข้อ จำกัด

ฟังก์ชันในตัวที่คำนวณพลังงานเมทริกซ์และผลิตภัณฑ์เมทริกซ์ไม่ได้รับอนุญาต

ส่วนที่เหลือของกฎมาตรฐานสำหรับ code-golf นำไปใช้

คำอธิบาย

รับเมทริกซ์จตุรัสAค่าของA n = AA ⋯ A (ผลิตภัณฑ์เมทริกซ์ที่ทำซ้ำของAด้วยตัวมันเอง, nคูณ) ถ้าnเป็นบวกจะใช้มาตรฐานที่กล่าวถึง เมื่อnเป็นศูนย์เมทริกซ์เอกลักษณ์ที่มีคำสั่งเดียวกันของเป็นผล

เป้าหมาย

นี่คือรหัสกอล์ฟและรหัสที่สั้นที่สุดชนะ

กรณีทดสอบ

นี่เป็นเมทริกซ์ใส่nเป็นจำนวนเต็มการป้อนข้อมูลและRคือเมทริกซ์เอาท์พุทที่R = n

n = 0
A = 62 72
    10 34
r =  1  0
     0  1

n = 1
A = 23 61 47
    81 11 60
    42  9  0
r = 23 61 47
    81 11 60
    42  9  0

n = 2
A =  12  28 -26  3
     -3 -10 -13  0
     25  41   3 -4
    -20 -14  -4 29
r = -650 -1052  -766 227
    -331  -517   169  43
     332   469 -1158 -53
    -878  -990   574 797

n = 4
A = -42 -19  18 -38
    -33  26 -13  31
    -43  25 -48  28
     34 -26  19 -48
r = -14606833  3168904 -6745178  4491946
      1559282  3713073 -4130758  7251116
      8097114  5970846 -5242241 12543582
     -5844034 -4491274  4274336 -9196467

n = 5
A =  7  0 -3  8 -5  6 -6
     6  7  1  2  6 -3  2
     7  8  0  0 -8  5  2
     3  0  1  2  4 -3  4
     2  4 -1 -7 -4 -1 -8
    -3  8 -9 -2  7 -4 -8
    -4 -5 -1  0  5  5 -1
r =  39557  24398 -75256 131769  50575   14153  -7324
    182127  19109   3586 115176 -23305    9493 -44754
    146840  31906 -23476 190418 -38946   65494  26468
     42010 -21876  41060 -13950 -55148   19290   -406
     44130  34244 -35944  34272  22917  -39987 -54864
      1111  40810 -92324  35831 215711 -117849 -75038
    -70219   8803 -61496   6116  45247   50166   2109

3
สิ่งที่เกี่ยวกับบิวด์อินสำหรับผลิตภัณฑ์เมทริกซ์หรือเมทริกซ์ผกผัน
เดนนิส

@ เดนนิสฉันกำลังพิจารณาแบนพวกมันด้วย แต่มันก็รู้สึกเหมือนกัน ด้วยเข้มงวดเกินไป
ไมล์

2
สำหรับภาษาที่ไม่มีเมทริกซ์ผกผันในตัวการโจมตีแบบนี้เป็นความท้าทายต่อผมเพราะการกลับเมทริกซ์จากรอยขีดข่วนดูเหมือนจะยากกว่าการทำผลิตภัณฑ์ซ้ำ
xnor

2
ฉันเห็นด้วยกับ @xnor และถ้าหากภาษาไม่มีเมทริกซ์ผกผัน แต่มีพลังเมทริกซ์ สามารถA^-1ใช้แทนได้inv(A)หรือไม่?
Luis Mendo

1
คือการexp(k*log(M))ได้รับอนุญาต? (แม้ว่ามันอาจจะไม่ได้ผลเพราะสาขาที่ไม่ซ้ำกัน)
xnor

คำตอบ:


4

วุ้น , 17 16 15 ไบต์

Z×'³S€€
LṬ€z0Ç¡

ลองออนไลน์!

ลิงก์ถาวรกับเอาต์พุตกริด: กรณีทดสอบ 1 | กรณีทดสอบ 2 | กรณีทดสอบ 3 | กรณีทดสอบ 4 | กรณีทดสอบ 5

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

LṬ€z0Ç¡  Main link. Arguments: A (matrix), n (power)

L        Get the length l of A.
 Ṭ€      Turn each k in [1, ..., l] into a Boolean list [0, 0, ..., 1] of length k.
   z0    Zip; transpose the resulting 2D list, padding with 0 for rectangularity.
         This constructs the identity matrix of dimensions k×k.
     Ç¡  Execute the helper link n times.

Z×'³S€€  Helper link. Argument: B (matrix)

Z        Zip; transpose rows and columns of B.
   ³     Yield A.
 ×'      Spawned multiplication; element-wise mutiply each rows of zipped B (i.e.,
         each column of B) with each row of A.
         This is "backwards", but multiplication of powers of A is commutative.
    S€€  Compute the sum of each product of rows.

5

MATL , 20 ไบต์

XJZyXyi:"!J2$1!*s1$e

ลองออนไลน์!

คำอธิบาย

วิธีนี้จะหลีกเลี่ยงการคูณเมทริกซ์ด้วยการทำด้วยตนเองโดยใช้การคูณองค์ประกอบที่ชาญฉลาดพร้อมการออกอากาศตามด้วยผลรวมแบบเวกเตอร์ โดยเฉพาะการคูณเมทริกซ์MและNขนาดs × sทั้งสอง:

  1. Mไขว้ เรียกเมทริกซ์ที่เกิดPขึ้น
  2. เปลี่ยนรูปขนาดของNดังกล่าวว่าNคือ "เปิด" กับแกนหมุนตามมิติครั้งแรกให้s × 1 × s 3D Qอาร์เรย์พูด
  3. คูณองค์ประกอบแต่ละPครั้งแต่ละองค์ประกอบQด้วยการออกอากาศโดยนัย วิธีการนี้ที่Pถูกจำลองแบบโดยอัตโนมัติsครั้งพร้อมสามมิติและQถูกจำลองแบบsครั้งพร้อมที่สองที่จะทำให้พวกเขาทั้งสองs × s × sก่อนที่จะคูณองค์ประกอบที่ชาญฉลาดที่เกิดขึ้นจริงที่เกิดขึ้น
  4. ซำพร้อมมิติที่แรกที่จะให้ผลผลิต 1 × s × sอาร์เรย์
  5. บีบมิตินำเดี่ยวออกเพื่อสร้างs × sผล

รหัสความคิดเห็น:

XJ      % take matrix A. Copy to clipboard J
ZyXy    % generate identity matrix of the same size
i:      % take exponent n. Generate range [1 2 ... n] (possibly empty)
"       % for each element in that range
  !     %   transpose matrix with product accumulated up to now (this is step 1)
  J     %   paste A
  2$1!  %   permute dimensions: rotation along first-dimension axis (step 2)
  *     %   element-wise multiplication with broadcast (step 3)
  s     %   sum along first dimension (step 4)
  1$e   %   squeeze out singleton dimension, i.e. first dimension (step 5)
        % end for. Display

ล้มเหลวเป็น 0 ....
CalculatorFeline

@CatsAreFluffy ขอบคุณ! แก้ไขแล้ว
Luis Mendo

3

APL, 32 31 ตัวอักษร

{⍺=0:(⍴⍵)⍴1⍨1+≢⍵⋄+.×⍨⍣(⍺-1)⊣⍵}

อาร์กิวเมนต์ซ้ายพลังที่จะยกไป, อาร์กิวเมนต์ที่ถูกต้องเมทริกซ์ บิตที่ยากที่สุด (ใช้พื้นที่มากที่สุด) กำลังสร้างเมทริกซ์เอกลักษณ์สำหรับกรณีที่เลขชี้กำลังที่ต้องการคือ 0 การคำนวณจริงขึ้นอยู่กับความจริงที่ว่าผลิตภัณฑ์ภายในทั่วไป ( .) ที่มี+และ×เป็นตัวถูกดำเนินการได้อย่างมีประสิทธิภาพผลิตภัณฑ์เมทริกซ์ สิ่งนี้รวมกับตัวดำเนินการพลังงาน("ซ้ำ") ทำให้เกิดเนื้อของสารละลาย


1: คุณคือ Stefano ที่เอาชนะ Dan & Nick หนึ่งไบต์ในเกมปี 2559 ใช่ไหม! 2. (1+≢⍵)↑1=> 1↑⍨1+≢⍵เพื่อบันทึกหนึ่งไบต์
Zacharý

ใช่นั่นฉันเอง.
lstefano

2

Sage, 112 ไบต์

lambda A,n:reduce(lambda A,B:[[sum(map(mul,zip(a,b)))for b in zip(*B)]for a in A],[A]*n,identity_matrix(len(A)))

ลองออนไลน์

คำอธิบาย:

แลมบ์ดาชั้นใน ( lambda A,B:[[sum(map(mul,zip(a,b)))for b in zip(*B)]for a in A]) เป็นการนำการคูณเมทริกซ์มาใช้อย่างตรงไปตรงมา แลมบ์ดานอก ( lambda A,n:reduce(...,[A]*n,identity_matrix(len(A)))) ใช้reduceในการคำนวณอำนาจเมทริกซ์โดยคูณเมทริกซ์ซ้ำ (โดยใช้ฟังก์ชั่นดังกล่าวข้างต้นคูณเมทริกซ์โฮมเมด) n=0กับเมทริกซ์เอกลักษณ์เป็นค่าเริ่มต้นที่ให้การสนับสนุน


2

Julia, 90 86 68 ไบต์

f(A,n)=n<1?eye(A):[A[i,:][:]⋅f(A,n-1)[:,j]for i=m=1:size(A,1),j=m]

นี่เป็นฟังก์ชันแบบเรียกซ้ำที่ยอมรับเมทริกซ์ (Array{Int,2} ) และจำนวนเต็มและส่งกลับเมทริกซ์

Ungolfed:

function f(A, n)
    if n < 1
        # Identity matrix with the same type and dimensions as the input
        eye(A)
    else
        # Compute the dot product of the ith row of A and the jth column
        # of f called on A with n decremented
        [dot(A[i,:][:], f(A, n-1)[:,j]) for i = (m = 1:size(A,1)), j = m]
    end
end

ลองออนไลน์! (รวมถึงทั้งหมดยกเว้นกรณีทดสอบล่าสุดซึ่งช้าเกินไปสำหรับไซต์)

บันทึกไปแล้ว 18 ไบต์ขอบคุณเดนนิส!


2

Python 2.7, 158 145 ไบต์

คำตอบที่แย่ที่สุดที่นี่ แต่สนามกอล์ฟที่ดีที่สุดของฉันใน Python อย่างน้อยก็สนุกกับการเรียนรู้วิธีการคูณเมทริกซ์

แข็งแรงเล่นกอล์ฟ:

def q(m,p):
 r=range(len(m))
 if p<1:return[[x==y for x in r]for y in r]
 o=q(m,p-1)
 return[[sum([m[c][y]*o[x][c]for c in r])for y in r]for x in r]

คำอธิบาย:

#accepts 2 arguments, matrix, and power to raise to
def power(matrix,exponent):
 #get the range object beforehand
 length=range(len(matrix))
 #if we are at 0, return the identity
 if exponent<1:
  #the Boolean statement works because Python supports multiplying ints by bools
  return [[x==y for x in length] for y in length]
 #otherwise, recur
 lower=power(matrix,exponent-1)
 #and return the product
 return [[sum([matrix[c][y]*lower[x][c] for c in length]) for y in length] for x in length]

1

JavaScript (ES6), 123 ไบต์

(n,a)=>[...Array(n)].map(_=>r=m(i=>m(j=>m(k=>s+=a[i][k]*r[k][j],s=0)&&s)),m=g=>a.map((_,n)=>g(n)),r=m(i=>m(j=>+!(i^j))))&&r

ฉันใช้เวอร์ชัน 132 ไบต์reduceแต่ฉันเพิ่งทำแผนที่aบ่อย ๆ จนมันสั้นลงเหลือเพียง9 ไบต์ในการเขียนฟังก์ชันตัวช่วยที่จะทำเพื่อฉัน ทำงานโดยการสร้างเมทริกซ์เอกลักษณ์และคูณโดยaตัวหนังสือnครั้ง มีจำนวนของนิพจน์ที่ส่งคืน0หรือ1แทนi == jแต่ดูเหมือนทั้งหมดจะมีความยาว 7 ไบต์



1

R, 49 ไบต์

f=function(m,n)`if`(n,m%*%f(m,n-1),diag(nrow(m)))

ฟังก์ชั่นแบบเรียกซ้ำที่ใช้matrix และพลังnยกระดับให้ เรียกซ้ำ%*%ซึ่งคำนวณ dot-product ค่าเริ่มต้นสำหรับการเรียกซ้ำคือเมทริกซ์เอกลักษณ์ที่มีขนาดเท่าmกัน ตั้งแต่m %*% m = m %*% m %*% Iนี้ใช้งานได้ดี


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