Jejak matriks umum

23

Inspirasi.

Diberikan (dengan cara apa pun):

  • Fungsi kotak hitam dua argumen (atau argumen tunggal yang terdiri dari daftar dua elemen) , (input dan output adalah 1, 2, 3, ...)f: ℤ+ × ℤ+ → ℤ+
  • Matriks integer yang benar-benar positif dengan setidaknya dua baris dan dua kolom

mengembalikan jejak fungsi matriks .

Apa itu penelusuran fungsi ?

Jejak matriks normal adalah jumlah dari diagonal utama (kiri atas ke kanan bawah) dari sebuah matriks:

[[1,2,3],[4,5,6],[7,8,9]][1,5,9]1+5+915

Tetapi alih-alih menjumlahkan, kami ingin menerapkan fsepanjang diagonal:

[[1,2,3],[4,5,6],[7,8,9]][1,5,9]f(f(1,5),9)atauf(1,f(5,9))

Silakan sebutkan apakah Anda menggunakan kiri-ke-kanan atau kanan-ke-kiri.

Matriks yang diberikan dan semua nilai perantara akan benar-benar bilangan bulat positif dalam domain bilangan bulat bahasa Anda. Matriksnya mungkin non-kuadrat.

Contohnya

f(x,y) = xy, [[1,2,3],[4,5,6],[7,8,9]]1×5×945

f(x,y) = xy, [[1,2,3],[4,5,6],[7,8,9]]→ →1591

f(x,y) = x-y, [[4,5,6],[1,2,3]]4-22

f(x,y) = (x+y)⁄2, [[2,3,4],[5,6,7],[8,9,10]]5atau7

f(x,y) = x+2y, [[1,2,3],[4,5,6],[7,8,9]]47atau29

f(x,y) = max(x,y), [[1,2,3],[4,5,6],[7,8,9]]max(1,5,9)9

f(x,y) = 2x, [[1,2,3],[4,5,6],[7,8,9]]2atau4

f(x,y) = lcm(x,y), [[2,2,2],[2,2,3],[2,3,3],[4,4,4]]lcm(2,2,3)6

Implementasi referensi.

Adm
sumber
Apa yang diagonal [[2,2,2],[2,2,3],[2,3,3],[4,4,4]]?
Sepenuhnya manusiawi
3
@totallyhuman:[2,2,3]
Emigna
1
Sial, saya membaca judulnya sebagai "Generalized Matrix trance" dan sangat kecewa ketika halaman dimuat
tar

Jawaban:

9

R , 40 30 byte

function(m,F)Reduce(F,diag(m))

Cobalah online!

Verifikasi kasus uji.

Melintasi garis diagonal, sehingga kiri-ke-kanan dalam hal ini. Untuk operator aritmatika, Anda dapat menggunakan "+"atau melakukan backtick di sekitar operator ( +,*,-,%/%,^,%%)

Cukup mudah: Reduceadalah R yang setara dengan a fold, dan diagonal matriks adalah elemen-elemen di a_ijmana i==j, yaitu, di mana indeks rowdan column adalah sama. diagmemiliki perilaku yang sesuai untuk matriks non-square.

Giuseppe
sumber
8

Haskell , 39 byte

Terima kasih @Laikoni karena membantu saya memperbaiki solusi yang sebelumnya tidak valid!

f!m=foldl1 f[h|h:_<-zipWith drop[0..]m]

Rekanan di sebelah kiri, coba online! (ganti foldl1dengan foldr1untuk asosiasi kanan)

ბიმო
sumber
bagaimana foldl1 f$zipWith(!!)m[0..]?
haskeller bangga
@proudhaskeller: Itu ini apa yang orang lain sudah mencoba, tapi gagal pada matriks non-persegi ..
ბიმო
5

Mathematica , 16 byte

-1 byte terima kasih kepada Martin Ender.

#~Tr~Fold[g]@*0&

Cobalah online!

Solusi alternatif, 17 byte

Fold[g]@*Diagonal

Cobalah online!

benar-benar manusiawi
sumber
17 byte (fungsi kotak hitam dapat diasumsikan dengan nama yang diberikan)
Tn. Xcoder
Itu @*{}sintaks tidak membuat banyak akal (Anda mungkin berarti @*List), tetapi kenyataan bahwa ia bekerja pula cukup keren. Bahkan, itu berarti Anda dapat mengganti {}dengan 0dan menyimpan byte.
Martin Ender
@ MartinEnder sebenarnya saya sudah punya Listdulu tapi saya coba {}hanya untuk itu dan sangat terkejut bahwa itu berhasil. Masuk akal tetapi bagaimana cara 0kerjanya? o0
manusiawi
1
@totallyhuman Cara yang sama seperti {}. Saat ini Anda menggunakan {}sebagai fungsi (atau sebenarnya sebagai "kepala" menggunakan terminologi Mathematica). Jika Anda menggunakan generik di fsana, Anda akan mendapatkan f[1,2,3](jika itu diagonal). Tetapi dengan {}Anda dapatkan {}[1,2,3]. Itu ekspresi yang sama sekali tidak berarti, tetapi kepala bisa merupakan ekspresi sewenang-wenang sendiri, dan jika Mathematica tidak tahu apa yang harus dilakukan dengan mereka, itu hanya membiarkan mereka apa adanya. Sebagian besar fungsi manipulasi daftar Mathematica sebenarnya bekerja dengan ekspresi dengan kepala arbitrer dan dalam kasus Fold, kepala hanya diabaikan. [tbc]
Martin Ender
Jadi, Anda dapat menggunakan 0sebagai kepala sebagai gantinya, yang memberi 0[1,2,3]yang masih tidak berarti, tetapi bekerja semua sama.
Martin Ender
4

Oktaf , 61 57 53 byte

function m=g(f,m)for i=diag(m)'(2:end)m=f(m(1),i);end

Cobalah online!

Mendefinisikan fungsi gyang membutuhkan fungsi handle fdan matriks m. Pada iterasi pertama, m(1)mengembalikan elemen matriks kiri-atas; setelah itu, itu hanya kembali m.

Sanchises
sumber
53 byte
Giuseppe
@ Giuseppe Itulah yang saya lakukan dengan versi 61-byte awal saya. Tentu saja, saya harus menggabungkan poin kuat dari versi 57- dan 61 byte saya, yang memang memberikan jawaban 53 byte. Terima kasih telah membuat saya melihatnya lagi!
Sanchises
3

Bersih , 56 byte

t[[h:_]]f=h
t[[h]:_]f=h
t[[h:_]:r]f=f h(t[t\\[_:t]<-r]f)

Cobalah online! Lipatan dari kanan ke kiri.

[t\\[_:t]<-r]sama dengan map tl r, tetapi tidak perlu import StdEnv.

Laikoni
sumber
Penghindaran yang sangat eleganStdEnv
Οurous
3

Haskell , 47 45 42 byte

f%((h:t):r)|[]<-t*>r=h|x<-tail<$>r=f h$f%x

Cobalah online! Mendefinisikan fungsi (%)yang mengambil fungsi dan matriks sebagai daftar daftar sebagai input.

Fungsi ini dilipat dari kanan ke kiri:

f % [[1,2,3], -> f 1 ( f % [[5,6],   -> f 1 ( f 5 ( f % [[9]] ) ) -> f 1 ( f 5 ( f 9 ) ) )
     [4,5,6],               [8,9]] )
     [7,8,9]]

f % ((h:t):r)              -- (h:t) is the first row and r the remaining rows
 | [] <- t *> r = h         -- a shorter way of checking wether t==[] or r==[]
 | x<-tail<$>r = f h $ f%x -- apply f to h and the result of recursively calling (%) on
                           -- the remaining matrix with the first column removed

Sunting: -2 byte terima kasih kepada BMO dan -3 byte terima kasih kepada Zgarb !

Laikoni
sumber
1
43 byte dengan menggunakan $dan menyederhanakan kondisi dengan *>.
Zgarb
@ Zgarb Ide bagus untuk digunakan *>!
Laikoni
3

APL (Dyalog Unicode) , 7 byte ( Adám's SBCS )

⎕/1 1⍉⎕

Cobalah online!

-3 Berkat saran untuk mengonversikan ini ke program penuh oleh Adám .

Kanan ke kiri.

Erik the Outgolfer
sumber
Tidak perlu menggunakan AdBC SBCS di sini: Anda bisa menggunakan Dyalog Classic's.
Zacharý
@ Zachary Masalahnya adalah bahwa saya menjawab di Dyalog Unicode, Classic semakin ditinggalkan seiring waktu.
Erik the Outgolfer
Bukan codepage, tetapi codepage akan hidup
Zacharý
@ Zacharý Yah, mari kita lebih konsisten. : P
Erik the Outgolfer
2

Haskell , 44 byte

f#m=foldl1 f$zipWith(!!)m[0..length(m!!0)-1]

Cobalah online!

benar-benar manusiawi
sumber
2

ML Standar (MLton) , 59 byte

fun t[h::_]f=h|t([h]::_)f=h|t((h::_)::r)f=f(h,t(map tl r)f)

Cobalah online! Lipatan dari kanan ke kiri.

Tidak Disatukan:

fun trace [h::_]      f = h
  | trace ([h]::_)    f = h
  | trace ((h::_)::r) f = f (h, trace (map tl r) f)

Cobalah online!

Laikoni
sumber
2

Python 2 , 61 byte

lambda f,m:reduce(f,[l[i]for i,l in enumerate(m)if len(l)>i])

Cobalah online!

Ini bekerja dari kiri ke kanan.

tongkat
sumber
@ AsoneTuhid bisa dengan cara apa pun, periksa (x+y)⁄2dan x+2ycontoh
Rod
Benar, saya salah membaca, maaf
Asone Tuhid
2

JavaScript (ES6), 58 56 byte

g=(f,a,r=a[i=0][0],e=a[++i]&&a[i][i])=>e?g(f,a,f(r,e)):r

Lipatan dari kiri ke kanan. Sunting: Disimpan 2 byte dengan menggunakan fakta bahwa array benar-benar positif. Solusi alternatif, juga 56 byte:

(f,a,g=r=>(e=a[++i]&&a[i][i])?g(f(r,e)):r)=>g(a[i=0][0])
Neil
sumber
Ini tidak terlihat seperti Anda membutuhkan 1/dan Anda dapat menyimpan lain 2 byte dengan memindahkan beberapa barang di sekitar: f=>a=>(h=r=>(e=a[++i]&&a[i][i])?h(f(r,e)):r)(a[i=0][0]). TIO
Shaggy
@Shaggy Oh, ini benar-benar positif, saya belum pernah melihatnya.
Neil
Rupanya kita dapat mengasumsikan bahwa fungsi kotak hitam ditugaskan ke variabel yang telah ditentukan sehingga Anda dapat menyimpan 2 byte jika Anda ingin mengambil keuntungan dari itu.
Shaggy
@ Shaggy Sebenarnya saya pikir ini akan menghemat 4 byte (2x f,) dari versi pertama?
Neil
Kamu benar; maaf, lupa menghitung f,saat menelepon glagi.
Shaggy
2

JavaScript, 46 byte

f=>a=>a.reduce((p,l,i)=>l[i]?f(p[0]|p,l[i]):p)

Berkat @Shaggy, gunakan bitwise atau simpan satu byte. Itu ajaib.

tsh
sumber
Ini tampaknya tidak berfungsi jika matriks memiliki lebih banyak baris daripada kolom.
Shaggy
@Shaggy sangat sedih, 47 byte sekarang ...
tsh
Ya, itulah yang awalnya saya juga. Baru saja akan mengedit perbaikan ke solusi saya, tetapi Anda mengalahkan saya juga :( Saya pikir Anda bisa mendapatkan satu byte kembali, meskipun, dengan menggunakan bitwise OR, meskipun.
Shaggy
@Shaggy sangat ajaib
tsh
Lupa menyebutkan: Rupanya kita dapat mengasumsikan bahwa fungsi kotak-hitam ditugaskan ke variabel yang telah ditentukan sehingga Anda dapat menyimpan 3 byte jika Anda ingin memanfaatkannya.
Shaggy
2

Java 8, 88 81 70 byte

m->{int r=m[0][0],i=1;try{for(;;)r=f(r,m[i][i++]);}finally{return r;}}

Lipat [[1,2,3],[4,5,6],[7,8,9]]menjadi f(f(1,5),9).

-7 byte secara tidak langsung berkat @KamilDrakari dengan menggunakan trik yang sama seperti yang dia lakukan dalam jawaban C # : alih-alih memiliki batas maksimum untuk loop berdasarkan pada baris / kolom, cukup coba-tangkap ArrayIndexOutOfBoundsException.
-11 byte diganti catch(Exception e)dengan finally.

Cobalah online.

Old 88 byte jawaban:

m->{int r=m[0][0],i=1;for(;i<Math.min(m.length,m[0].length);)r=f(r,m[i][i++]);return r;}

Cobalah online.

Penjelasan:

m->{                   // Method with integer-matrix parameter and integer return-type
  int r=m[0][0],       //  Start the result at the integer of position 0,0 (0-indexed)
      i=1;             //  Start the index at 1 (0-indexed)
  try{for(;;)          //  Loop indefinitely
    r=f(r,m[i][i++]);} //   Call f with the result + next diagonal cell as arguments
                       //   (and increase `i` by 1 with `i++` afterwards)
  finally{             //  If an ArrayIndexOutOfBoundsException occurred we're done,
   return r;}}         //   in which case we return the result-integer

Format input kotak hitam:

Asumsikan ada fungsi bernama int f(int x,int y), yang diizinkan sesuai dengan jawaban meta ini .

Saya memiliki kelas abstrak yang Testberisi fungsi default f(x,y), serta lambda di atas:

abstract class Test{
  int f(int x,int y){
    return x+y;
  }

  public java.util.function.Function<int[][],Integer>c=
    m->{int r=m[0][0],i=1;for(;i<Math.min(m.length,m[0].length);)r=f(r,m[i][i++]);return r;}
  ;
}

Untuk kasus uji, saya menimpa fungsi ini f. Sebagai contoh, test case pertama disebut seperti ini:

System.out.println(new Test(){
  @Override
  int f(int x,int y){
    return x*y;
  }
}.c.apply(new int[][]{
  new int[]{1,2,3},
  new int[]{4,5,6},
  new int[]{7,8,9}
}));
Kevin Cruijssen
sumber
2

Attache , 14 byte

Fold#/Diagonal

Cobalah online! Setel ke fdan panggil sebagai f[function, array].

Penjelasan

Ini adalah percabangan dari dua fungsi: Folddan /Diagonal. Ini, untuk argumen fdan a, setara dengan:

Fold[f, (/Diagonal)[f, a]]

/, ketika diterapkan secara monadik ke suatu fungsi, mengembalikan fungsi yang diterapkan pada argumen terakhirnya. Jadi, ini setara dengan:

Fold[f, Diagonal[a]]

Ini melipat fungsi di fatas diagonal utama a.

Conor O'Brien
sumber
Bahasa buatan sendiri yang bisa
dibaca‽
@ Adám; D ya memang!
Conor O'Brien
2

AWK , 77 byte

func z(F,M,r){for(e=1;e<M[1]&&e<M[2];)r=@F(r==""?M[1,1]:r,M[++e,e])
return r}

Cobalah online!

Saya penasaran apakah AWKbisa melakukan pemrograman fungsional sama sekali. Saya pikir ini penting.

"Matriks" didefinisikan sebagai array asosiatif standar, dengan bidang tambahan M[1]=#rowsdan M[2]=#columns. Nama fungsi diteruskan sebagai string yang dievaluasi melalui @F(...)sintaks. Evaluasi dilakukan dari kiri ke kanan. The rparameter merupakan tempat untuk mencegah Timpa yang ada rvariabel dan untuk menghindari kebutuhan untuk reinitialize untuk setiap panggilan. Biasanya ruang tambahan ditambahkan untuk menunjuk placeholder tersebut AWK, tetapi ini adalah kode golf, jadi setiap byte diperhitungkan. :)

TIO link mengimplementasikan semua test case.

Robert Benson
sumber
2

05AB1E , 15 10 byte

Lipatan dari kanan ke kiri
Disimpan 5 byte menggunakan built-in baru seperti yang disarankan oleh Kevin Cruijssen

Å\`[.g#I.V

Penjelasan

Bekerja sama dengan versi lama, kecuali itu Å\adalah built-in baru untuk mendorong diagonal utama.

Cobalah online! atau sebagai Test Suite

Versi lama

¬g£vyNè}[.g#I.V

Cobalah online! atau sebagai Test suite

Penjelasan

¬                 # get the head of the input (first row)
 g                # get its length (number of columns)
  £               # take that many rows from input
   v              # for each row_index, row (N,y) do:
    y             # push the row
     Nè           # get the nth element of the row
       }          # end loop
        [.g#      # loop until one value remain on the stack
            I.V   # run the input function
Emigna
sumber
1
¬g£vyNè}[bisa Å\`[sekarang, menghemat 5 byte.
Kevin Cruijssen
1

Sekam , 7 byte

Terima kasih @Zgarb untuk memperbaiki kiriman saya!

Ḟ₁§z!Tŀ

Rekanan di sebelah kiri, Coba online! (untuk versi asosiatif kanan gantikan dengan F)

Penjelasan

Sayangnya tidak ada cara mudah untuk mendapatkan diagonal dari sebuah matriks, sehingga sebagian besar byte adalah untuk itu:

Ḟ₁§z!Tŀ  -- function ₁ is the function and matrix A implicit, example: 
  §      -- fork A
     T   -- | transpose A: [[1,4,7],[2,5,8],[3,6,9]]
      ŀ  -- | enumerate A: [1,2,3]
   z!    -- and zipWith index: [1,5,9]
Ḟ₁       -- right fold function
ბიმო
sumber
Huh, built-in untuk anti-diagonal, tetapi tidak untuk diagonal‽
Adám
2
@ Adm saya berasumsi itu karena Anda dapat menghitung antidiagonal dari matriks yang tak terbatas tetapi tidak diagonal.
Martin Ender
1

SNOBOL4 (CSNOBOL4) , 86 byte

T	I =1
	T =M<1,1>
I	I =I + 1
	T =EVAL(F '(T,M<I,I>)')	:S(I)F(RETURN)
	DEFINE('T(M,F)')

Cobalah online!

Menentukan fungsi T(untuk TRACE) yang mengambil ARRAYdan string Fyang merupakan nama fungsi. Lipatan dari kiri ke kanan.

Menggunakan referensi tidak langsung ( $) tidak berfungsi dengan fungsi. Jadi menggunakan EVALdan meneruskan string ke nama tampaknya menjadi satu-satunya cara untuk mendapatkan fungsi kotak hitam di SNOBOL.

Juga, cukup menyakitkan untuk mendefinisikan array; Namun, karena referensi array yang tidak valid menyebabkan FAILURE, ini bekerja untuk array non-kuadrat - jika Iberada di luar batas dalam dimensi baik, F(RETURN)memaksa fungsi untuk kembali.

Edit:

Mungkin, berdasarkan pada posting meta ini , saya dapat berasumsi bahwa fungsi kotak-hitam Fdidefinisikan dengan nama F, yang akan menjatuhkannya ke 75 byte (hapus penggunaan EVALdan ,Fdalam definisi fungsi). Namun, saya lebih suka versi ini karena lebih dekat dengan melewatkan referensi ke suatu fungsi.

Giuseppe
sumber
1

C, 76 byte

i,t;f(g,A,n,m)int*A,(*g)();{for(t=*A,i=m+1;--n*--m;t=g(t,*A))A+=i;return t;}

Kiri ke kanan.

Cobalah online!

Steadybox
sumber
1

tinylisp , 79 byte

(load library
(d D(q((M)(i(h M)(c(h(h M))(D(map t(t M))))(
(q((F M)(foldl F(D M

Baris terakhir adalah fungsi lambda tanpa nama yang mengambil fungsi dan matriks dan mengembalikan jejak matriks. Jejak adalah asosiatif kiri (yaitu f(f(1,5),9)). Cobalah online!

Tidak disatukan

Kami mendefinisikan fungsi pembantu untuk menghitung diagonal; kemudian generalized-tracehanyalah pembungkus kecil di sekitar fungsi perpustakaan foldl.

(load library)

(def diagonal
 (lambda (matrix)
  (if (head matrix)
   (cons
    (head (head matrix))
    (diagonal (map tail (tail matrix))))
   nil)))

(def generalized-trace
 (lambda (func matrix)
  (foldl func (diagonal matrix))))

Saat menghitung diagonal secara rekursif, kami memeriksa apakah (head matrix)itu benar. Jika matriks keluar dari baris, itu akan menjadi daftar kosong (nil), dan headnil adalah nil - falsey. Atau, jika matriks keluar dari kolom, baris pertama (kepala) akan menjadi daftar kosong (nil) - falsey. Jika tidak, akan ada baris pertama kosong, yang benar.

Jadi, jika baris pertama tidak ada atau kosong, kami mengembalikan nihil. Kalau tidak, jika ada baris pertama kosong, kita ambil (head (head matrix))- elemen pertama dari baris pertama - dan cons(tambahkan) itu ke hasil panggilan rekursif. Argumen untuk panggilan rekursif adalah (map tail (tail matrix))--yaitu, ambil semua baris kecuali yang pertama, dan ambil semua kecuali elemen pertama dari setiap baris.

DLosc
sumber
1

C # (Visual C # Compiler) , 72 69 60 byte

m=>{try{for(int i=1;;m[0][0]=f(m[0][0],m[i][i++]));}catch{}}

Cobalah online!

try/catch memungkinkan diagonal untuk dicapai dengan benar hanya dengan menyusuri dan mengakhiri ketika di luar batas.

3 byte disimpan karena, sebagaimana ditunjukkan oleh Kevin Cruijssen, fungsi kotak hitam dapat diasumsikan ada dengan nama tertentu .

9 byte disimpan dengan mengembalikan melalui memodifikasi argumen .

Dengan demikian, fungsi dipanggil dengan menyimpan fungsi yang diinginkan di bawah nama f, panggilan trace(matrix), dan hasilnya disimpan di matrix[0][0].

Atau, jika Anda benar-benar menyukai kata kerja,

C # (Visual C # Compiler) , 97 + 13 = 110 78 69 byte

(int[][]m)=>{try{for(int i=1;;m[0][0]=f(m[0][0],m[i][i++]));}catch{}}

Cobalah online!

32 byte disimpan dengan menggunakan fungsi yang telah ditentukan, karena tidak mengambil fungsi sebagai parameter diperbolehkan menghapus Systemimpor dan Functipe generik panjang .

Kamil Drakari
sumber
Trik yang bagus dengan try-catch. Saya sudah bisa golf 7 byte pada jawaban Java 8 saya (walaupun saya harus menggunakan catch(Exception e)bukan catch. :) EDIT: Oh, bisa mengganti catch(Exception e)dengan finallyuntuk menghemat lebih banyak byte. Terima kasih lagi. +1 dari saya.
Kevin Cruijssen
@KevinCruijssen Anda mungkin juga dapat memperoleh manfaat dari peningkatan terbaru saya (meskipun saya tidak ingat pasti apakah Java dapat menerima modifikasi argumen)
Kamil Drakari
Terima kasih telah memberi tahu saya. Meskipun mungkin di Jawa, itu berarti saya harus mengubah finallymenjadi catch(Exception e), karena saya tidak akan kembali ke dalam lagi. Jadi m->{try{for(int i=1;;m[0][0]=f(m[0][0],m[i][i++]));}catch(Exception e){}}(73 byte) sayangnya lebih lama bagi saya dibandingkan dengan jawaban saya saat ini m->{int r=m[0][0],i=1;try{for(;;)r=f(r,m[i][i++]);}finally{return r;}}(70 byte) Tapi memang cara yang bagus untuk menyimpan byte dalam jawaban Anda! :) Sayang sekali saya hanya bisa memberi +1 pada jawaban Anda sekali.
Kevin Cruijssen
1

JavaScript, 61 57 56 52 50 44 42 byte

Mengurangi kiri ke kanan. Menganggap fungsi ditugaskan ke variabel f, sesuai meta post ini dibawa ke perhatian saya oleh Mr. Xcoder & totallyhuman. Tidak dapat mengatakan karena saya setuju dengan itu karena secara langsung bertentangan dengan konsensus kami yang ada bahwa kami mungkin tidak menganggap input ditugaskan ke variabel yang telah ditentukan, tetapi saya akan mengambil beberapa byte penghematan untuk saat ini.

a=>a.map((y,z)=>x=(n=y[z])?z?f(x,n):n:x)|x

Uji Kasus

g=
a=>a.map((y,z)=>x=(n=y[z])?z?f(x,n):n:x)|x
o.innerHTML=[[`f(x,y) = xy`,[[1,2,3],[4,5,6],[7,8,9]],(x,y)=>x*y,45],[`f(x,y) = x<sup>y</sup>`,[[1,2,3],[4,5,6],[7,8,9]],(x,y)=>x**y,1],[`f(x,y) = x-y`,[[4,5,6],[1,2,3]],(x,y)=>x-y,2],[`f(x,y) = <sup>(x+y)</sup>⁄<sub>2</sub>`,[[2,3,4],[5,6,7],[8,9,10]],(x,y)=>(x+y)/2,7],[`f(x,y) = x+2y`,[[1,2,3],[4,5,6],[7,8,9]],(x,y)=>x+2*y,29],[`f(x,y) = max(x,y)`,[[1,2,3],[4,5,6],[7,8,9]],(x,y)=>Math.max(x,y),9],[`f(x,y) = 2x`,[[1,2,3],[4,5,6],[7,8,9]],(x,y)=>2*x,4],[`f(x,y) = lcm(x,y)`,[[2,2,2],[2,2,3],[2,3,3],[4,4,4]],(x,y)=>-~[...Array(x*y).keys()].find(z=>!(++z%x|z%y)),6]].map(([a,b,c,d],e)=>`Test #${++e}:  ${a}\nMatrix:   ${JSON.stringify(b)}\nFunction: ${f=c}\nResult:   ${g(b)}\nExpected: ${d}`).join`\n\n`
<pre id=o></pre>

Shaggy
sumber
1

APL NARS, 20 byte, 10 karakter

{⍺⍺/1 1⍉⍵}

uji:

  f←{⍺⍺/1 1⍉⍵}
  ⎕←q←3 3⍴⍳10    
1 2 3
4 5 6
7 8 9
  ×f q
45
  *f q
1
  {⍺+2×⍵}f q
47
  ⌈f q
9
  {2×⍺+0×⍵}f q
2
  -f ⊃(4 5 6)(1 2 3)
2
  {(⍺+⍵)÷2}f ⊃(2 3 4)(5 6 7)(8 9 10)
5
  ∧f ⊃(2 2 2)(2 2 3)(2 3 3)(4 4 4)
6
RosLuP
sumber
Kerja bagus. Sementara saya pikir Anda tiba pada ini sendiri, itu kebetulan identik dengan solusi asli Erik the Outgolfer .
Adám
0

Jelly , 5 byte

Kiri ke kanan.

ŒDḢç/

Cobalah online!

Penafian: Saya tidak tahu apakah ini metode input yang dapat diterima untuk fungsi kotak hitam. Ini mengasumsikan bahwa fungsi tersebut diimplementasikan dalam tautan di atas, dan dengan demikian "dinamai" (yaitu, dapat dipanggil dengan) ç, tetapi sebaliknya saya tidak memiliki cara untuk menetapkannya ç. Jika ada yang lebih berpengalaman dengan fungsi kotak jelly +, saya akan sangat menghargai pikiran. Setelah menghabiskan beberapa waktu dalam obrolan, kami menganggap bahwa menggunakan çmungkin memang valid.

Tuan Xcoder
sumber
0

Clojure, 30 byte

#(reduce %2(map nth %(range)))

Mengurangi "dari kiri".

NikoNyrh
sumber