Ada banyak cara berbeda untuk menjelaskan perkalian matriks. Saya akan tetap dengan satu figur karena saya percaya sebagian besar orang di sini akrab dengannya (dan angka itu sangat deskriptif). Jika Anda ingin informasi lebih rinci, saya sarankan Anda mengunjungi artikel Wikipedia , atau penjelasan tentang WolframMathWorld .
Penjelasan sederhana:
Misalkan Anda memiliki dua matriks, A dan B , di mana A adalah 3-oleh-2, dan B adalah 2-oleh-3. Jika Anda melakukan perkalian matriks pada matriks ini, baik AB , atau BA Anda akan mendapatkan hasil di bawah ini:
Tantangan:
Terapkan penggandaan matriks simbolik dalam bahasa Anda. Anda harus mengambil dua matriks sebagai input, di mana setiap elemen dalam matriks diwakili oleh karakter ASCII non-spasi putih (kode poin 33-126). Anda harus mengeluarkan produk dari matriks ini.
Aturan tentang output:
Produk dari dua entri tidak boleh memiliki simbol di antaranya. Ini ab
, tidak a*b
, a·b
, times(a,b)
atau sesuatu yang serupa. Ini aa
, tidak a^2
.
Jumlah istilah harus memiliki spasi (ASCII kode titik 32) di antaranya. Ini a b
, bukan a+b
, plus(a,b)
atau sesuatu yang serupa.
Alasan dari kedua aturan tersebut adalah: Semua karakter non-spasi putih diizinkan sebagai simbol dalam matriks, sehingga menggunakannya sebagai simbol matematika akan berantakan. Jadi, apa yang biasanya Anda bisa menulis sebagai a*b+c*d
akan ab cd
.
Anda dapat memilih urutan persyaratan. ab cd
, dc ab
dan cd ba
secara matematis sama, sehingga Anda dapat memilih pesanan di sini juga. Urutan tidak perlu konsisten selama itu benar secara matematis.
Aturan tentang pemformatan matriks:
Matriks dapat dimasukkan dalam format apa pun yang Anda suka, kecuali satu string tanpa pembatas di antara baris (ini karena output akan benar-benar kacau). Kedua matriks harus dimasukkan pada format yang sama. Semua contoh di bawah ini adalah cara yang valid untuk memasukkan dan mengeluarkan matriks.
"ab;cd" <- This will look awful, but it's still accepted.
"a,b\nc,d"
[[a,b],[c,d]]
[a, b]
[c, d]
Saya sadar bahwa ini memungkinkan banyak format yang akan terlihat berantakan, tetapi tantangannya adalah tentang mengalikan matriks, bukan memformat output.
Aturan umum:
- Anda dapat menerima input yang valid. Penggandaan matriks akan selalu dimungkinkan dengan dimensi yang diberikan.
- Hanya akan ada dua matriks.
- Anda dapat mengasumsikan bahwa matriks tidak kosong
- Fungsi bawaan diterima (tapi mungkin agak rumit karena persyaratan pemformatan).
- Anda tentu saja dapat menggunakan karakter melarikan diri dalam input jika perlu (
\'
bukan'
). - Setiap input dan output metode standar OK .
Kasus uji:
Dua matriks input ditampilkan dengan garis kosong di antaranya. Output ditampilkan setelah Output:
. Ketika ada dua matriks keluaran maka itu hanya untuk menunjukkan keluaran lain yang akan diterima.
Uji kasus # 1
Inputs:
[a]
[b]
Output:
[ab]
[ba] <- Also OK
Uji kasus # 2
Inputs:
[a, b]
[1, 4]
[y, {]
[%, 4, 1]
[a, b, c]
Output:
[a% ba, a4 bb, a1 bc]
[1% 4a, 14 4b, 11 4c]
[y% {a, y4 {b, y1 {c]
Test case # 3:
Inputs:
[1, 2, 3, 4]
[5, 6, 7, 8]
[9, 1, 2, 3]
[4, 5, 6, 7]
[a]
[b]
[c]
[d]
Output:
[1a 2b 3c 4d]
[5a 6b 7c 8d]
[9a 1b 2c 3d]
[4a 5b 6c 7d]
[d4 c3 b2 a1] <-- Also OK
[d8 c7 b6 a5]
[1b 9a c2 3d]
[a4 b5 d7 6c]
Jika respons Anda terhadap aturan tentang keharusanab cd
alih - alih a*b+c*d
adalah: Anda harus menghindari format input / output yang rumit , maka saya ingin mencatat bahwa format input dan output sangat fleksibel. Fakta bahwa Anda tidak dapat menggunakan *
dan +
untuk produk dan jumlah mungkin membuatnya lebih sulit untuk menggunakan built-in yang sederhana, tapi saya tidak menganggap hal negatif itu.
sumber
Jawaban:
Haskell ,
6261 byteCobalah online! Contoh penggunaan:
Saya menemukan cara untuk mendapatkan
transpose
fungsi dalam satu byte lebih pendek daripada menggunakan impor:Versi lama dengan impor: (62 byte)
Cobalah online!
Ini sangat mirip dengan jawaban saya untuk non-simbolis perkalian matriks :
a!b=[sum.zipWith(*)r<$>transpose b|r<-a]
, mengganti perkalian(*)
dengan penggabungan string(++)
dansum
denganunwords
yang merangkai daftar string dengan ruang di antara. Impor diperlukan untuktranspose
fungsi, jadi semuanya transposisi dari matriks kedua menggunakan setengah dari byte ...Versi lama tanpa impor: (64 byte)
Cobalah online!
Dengan impor dan
transpose
fungsi yang mengambil banyak byte, saya mencoba menyelesaikan tugas tanpa impor. Sejauh ini pendekatan ini ternyata dua byte lebih lama, tetapi mungkin lebih golf. Sunting: Pendekatan lain di atas sekarang mengalahkan impor!Pemahaman daftar
[s:t|_:s:t<-b]
mendapatkan ekor yang tidak kosong dari daftarb
, menggunakan hanya[t|_:t<-b]
untuk mendapatkan ekor akan menjadi 4 byte lebih pendek (bahkan mengalahkan versi impor) tetapi menambahkan baris kosong seperti["","",""]
ke matriks yang saya kira tidak diperbolehkan.sumber
Mathematica, 36 byte
Inner
adalah generalisasi dari MathematicaDot
(yaitu produk matriks / vektor biasa). Ini generalisasi produk titik dengan membiarkan Anda memberikan dua fungsif
dang
, yang akan digunakan sebagai pengganti perkalian dan penambahan yang biasa, masing-masing. Kami mengganti perkalian dengan#<>#2&
(yang menggabungkan dua karakter menjadi string tunggal) dan tambahan denganStringRiffle@*List
, yang pertama membungkus semua puncak dalam daftar, dan kemudianStringRiffle
bergabung bersama-sama dengan spasi.Seseorang bisa berpotensi menggunakan
Dot
operator.
dan kemudian mentransformasikan hasilnya, tetapi masalahnya adalah hal-hal seperti"a"*"a"
akan segera ditransformasikan menjadi"a"^2
(sama dengan jumlah), yang akan menjengkelkan jika harus dipisahkan lagi.sumber
Ruby, 61 byte
Contoh dijalankan:
sumber
Clojure, 53 byte
Berjalan dengan argumen
[["a" "b"]["c" "e"]]
dan[["f" "g"]["h" "i"]]
kembali((("af" "bh") ("ag" "bi")) (("cf" "eh") ("cg" "ei")))
. Ini sebenarnya lebih pendek dari versi numerik .sumber
Dyalog APL , 10 byte
Mengambil matriks karakter sebagai argumen kiri dan kanan. Mengembalikan matriks daftar karakter. (APL mewakili string sebagai daftar karakter.)
TryAPL online!
Produk dalam normal ada di APL
+.×
, tetapi penambahan dan perkalian dapat berupa fungsi apa pun, khususnya:Penambahan telah digantikan oleh
{
fungsi anonim: daftar∊
rata yang⍺ ' ' ⍵
terdiri dari argumen kiri, spasi, dan argumen kanan⍵
}
Perkalian telah digantikan oleh penggabungan,
,
sumber
Jelly , 7 byte
Ini adalah tautan diadik yang menggunakan B dan A sebagai argumen (dalam urutan itu) dan mengembalikan AB . Input dan output dalam bentuk array string 2D, yang sebenarnya adalah array karakter 3D. Byte lebih lanjut dapat disimpan dengan mengambil array karakter 2D sebagai input Saya tidak yakin apakah itu diizinkan.
Cobalah online!
Agak sulit untuk menentukan apa yang dilakukan Jelly di balik tudung ketika dawai terlibat, karena ia banyak melakukan percat sebelum dicetak. Ini adalah bagaimana Jelly mewakili input dan output secara internal.
Bagaimana itu bekerja
sumber
Prolog,> 256 Bytes
Saya menggunakan {_ | _} yang merupakan findall / 3, _ [_, _] yang merupakan beberapa arg / 3, dan jumlah (_) yang merupakan agregat. Mereka semua dapat digunakan di dalam adalah / 2:
Bersama dengan definisi tambahan untuk predikat yang disebutkan di atas dan non-standar adalah / 2 yang dapat mengembalikan lebih dari angka, pasti> 256 byte.
sumber
JavaScript (ES6), 65 byte
Mengambil input sebagai dua array karakter 2D dan mengembalikan array string 2D. Tambahkan 10 byte untuk mendukung input sebagai dua array string 1D.
sumber
Pyth, 14 byte
Sebuah program yang mengambil input dari dua daftar karakter dua dimensi yang dipisahkan oleh baris baru dan mencetak daftar string dua dimensi.
Suite uji
Bagaimana itu bekerja
[Penjelasan datang nanti]
sumber
Pip , 17 byte
Ini adalah fungsi yang mengambil dua daftar string (karakter tunggal) bersarang dan mengembalikan daftar string yang bersarang. Cobalah online! (dengan dua kasus uji).
Penjelasan
Argumen ke
{}
fungsi -delimited ditugaskan ke variabel lokala
untuke
. Argumen pertama dari fungsi lambda diwakili oleh_
.sumber