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+9
→15
Tetapi alih-alih menjumlahkan, kami ingin menerapkan f
sepanjang 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×9
→45
f(x,y) = xy
, [[1,2,3],[4,5,6],[7,8,9]]
→ →159
1
f(x,y) = x-y
, [[4,5,6],[1,2,3]]
→ 4-2
→2
f(x,y) = (x+y)⁄2
, [[2,3,4],[5,6,7],[8,9,10]]
→ 5
atau7
f(x,y) = x+2y
, [[1,2,3],[4,5,6],[7,8,9]]
→ 47
atau29
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]]
→ 2
atau4
f(x,y) = lcm(x,y)
, [[2,2,2],[2,2,3],[2,3,3],[4,4,4]]
→ lcm(2,2,3)
→6
[[2,2,2],[2,2,3],[2,3,3],[4,4,4]]
?[2,2,3]
Jawaban:
R ,
4030 byteCobalah 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:
Reduce
adalah R yang setara dengan afold
, dandiagonal matriks adalah elemen-elemen dia_ij
manai==j
, yaitu, di mana indeksrow
dancol
umn adalah sama.diag
memiliki perilaku yang sesuai untuk matriks non-square.sumber
Haskell , 39 byte
Terima kasih @Laikoni karena membantu saya memperbaiki solusi yang sebelumnya tidak valid!
Rekanan di sebelah kiri, coba online! (ganti
foldl1
denganfoldr1
untuk asosiasi kanan)sumber
foldl1 f$zipWith(!!)m[0..]
?Mathematica , 16 byte
-1 byte terima kasih kepada Martin Ender.
Cobalah online!
Solusi alternatif, 17 byte
Cobalah online!
sumber
@*{}
sintaks tidak membuat banyak akal (Anda mungkin berarti@*List
), tetapi kenyataan bahwa ia bekerja pula cukup keren. Bahkan, itu berarti Anda dapat mengganti{}
dengan0
dan menyimpan byte.List
dulu tapi saya coba{}
hanya untuk itu dan sangat terkejut bahwa itu berhasil. Masuk akal tetapi bagaimana cara0
kerjanya? o0{}
. Saat ini Anda menggunakan{}
sebagai fungsi (atau sebenarnya sebagai "kepala" menggunakan terminologi Mathematica). Jika Anda menggunakan generik dif
sana, Anda akan mendapatkanf[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 kasusFold
, kepala hanya diabaikan. [tbc]0
sebagai kepala sebagai gantinya, yang memberi0[1,2,3]
yang masih tidak berarti, tetapi bekerja semua sama.Oktaf ,
615753 byteCobalah online!
Mendefinisikan fungsi
g
yang membutuhkan fungsi handlef
dan matriksm
. Pada iterasi pertama,m(1)
mengembalikan elemen matriks kiri-atas; setelah itu, itu hanya kembalim
.sumber
Bersih , 56 byte
Cobalah online! Lipatan dari kanan ke kiri.
[t\\[_:t]<-r]
sama denganmap tl r
, tetapi tidak perluimport StdEnv
.sumber
StdEnv
Haskell ,
474542 byteCobalah online! Mendefinisikan fungsi
(%)
yang mengambil fungsi dan matriks sebagai daftar daftar sebagai input.Fungsi ini dilipat dari kanan ke kiri:
Sunting: -2 byte terima kasih kepada BMO dan -3 byte terima kasih kepada Zgarb !
sumber
$
dan menyederhanakan kondisi dengan*>
.*>
!APL (Dyalog Unicode) , 7 byte ( Adám's SBCS )
Cobalah online!
-3 Berkat saran untuk mengonversikan ini ke program penuh oleh Adám .
Kanan ke kiri.
sumber
Haskell , 44 byte
Cobalah online!
sumber
ML Standar (MLton) , 59 byte
Cobalah online! Lipatan dari kanan ke kiri.
Tidak Disatukan:
Cobalah online!
sumber
Python 2 , 61 byte
Cobalah online!
Ini bekerja dari kiri ke kanan.
sumber
(x+y)⁄2
danx+2y
contohJavaScript (ES6),
5856 byteLipatan dari kiri ke kanan. Sunting: Disimpan 2 byte dengan menggunakan fakta bahwa array benar-benar positif. Solusi alternatif, juga 56 byte:
sumber
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])
. TIOf,
) dari versi pertama?f,
saat menelepong
lagi.JavaScript, 46 byte
Berkat @Shaggy, gunakan bitwise atau simpan satu byte. Itu ajaib.
Tampilkan cuplikan kode
sumber
Java 8,
888170 byteLipat
[[1,2,3],[4,5,6],[7,8,9]]
menjadif(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)
denganfinally
.Cobalah online.
Old 88 byte jawaban:
Cobalah online.
Penjelasan:
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
Test
berisi fungsi defaultf(x,y)
, serta lambda di atas:Untuk kasus uji, saya menimpa fungsi ini
f
. Sebagai contoh, test case pertama disebut seperti ini:sumber
Attache , 14 byte
Cobalah online! Setel ke
f
dan panggil sebagaif[function, array]
.Penjelasan
Ini adalah percabangan dari dua fungsi:
Fold
dan/Diagonal
. Ini, untuk argumenf
dana
, setara dengan:/
, ketika diterapkan secara monadik ke suatu fungsi, mengembalikan fungsi yang diterapkan pada argumen terakhirnya. Jadi, ini setara dengan:Ini melipat fungsi di
f
atas diagonal utamaa
.sumber
AWK , 77 byte
Cobalah online!
Saya penasaran apakah
AWK
bisa melakukan pemrograman fungsional sama sekali. Saya pikir ini penting."Matriks" didefinisikan sebagai array asosiatif standar, dengan bidang tambahan
M[1]=#rows
danM[2]=#columns
. Nama fungsi diteruskan sebagai string yang dievaluasi melalui@F(...)
sintaks. Evaluasi dilakukan dari kiri ke kanan. Ther
parameter merupakan tempat untuk mencegah Timpa yang adar
variabel dan untuk menghindari kebutuhan untuk reinitialize untuk setiap panggilan. Biasanya ruang tambahan ditambahkan untuk menunjuk placeholder tersebutAWK
, tetapi ini adalah kode golf, jadi setiap byte diperhitungkan. :)TIO link mengimplementasikan semua test case.
sumber
05AB1E ,
1510 byteLipatan dari kanan ke kiri
Disimpan 5 byte menggunakan built-in baru seperti yang disarankan oleh Kevin Cruijssen
Penjelasan
Bekerja sama dengan versi lama, kecuali itu
Å\
adalah built-in baru untuk mendorong diagonal utama.Cobalah online! atau sebagai Test Suite
Versi lama
Cobalah online! atau sebagai Test suite
Penjelasan
sumber
¬g£vyNè}[
bisaÅ\`[
sekarang, menghemat 5 byte.Sekam , 7 byte
Terima kasih @Zgarb untuk memperbaiki kiriman saya!
Rekanan di sebelah kiri, Coba online! (untuk versi asosiatif kanan gantikan
Ḟ
denganF
)Penjelasan
Sayangnya tidak ada cara mudah untuk mendapatkan diagonal dari sebuah matriks, sehingga sebagian besar byte adalah untuk itu:
sumber
SNOBOL4 (CSNOBOL4) , 86 byte
Cobalah online!
Menentukan fungsi
T
(untukTRACE
) yang mengambilARRAY
dan stringF
yang merupakan nama fungsi. Lipatan dari kiri ke kanan.Menggunakan referensi tidak langsung (
$
) tidak berfungsi dengan fungsi. Jadi menggunakanEVAL
dan 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 - jikaI
berada 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
F
didefinisikan dengan namaF
, yang akan menjatuhkannya ke 75 byte (hapus penggunaanEVAL
dan,F
dalam definisi fungsi). Namun, saya lebih suka versi ini karena lebih dekat dengan melewatkan referensi ke suatu fungsi.sumber
C, 76 byte
Kiri ke kanan.
Cobalah online!
sumber
tinylisp , 79 byte
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-trace
hanyalah pembungkus kecil di sekitar fungsi perpustakaanfoldl
.Saat menghitung diagonal secara rekursif, kami memeriksa apakah
(head matrix)
itu benar. Jika matriks keluar dari baris, itu akan menjadi daftar kosong (nil), danhead
nil 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 - dancons
(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.sumber
Pari / GP , 42 byte
Cobalah online!
sumber
C # (Visual C # Compiler) ,
726960 byteCobalah 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
, panggilantrace(matrix)
, dan hasilnya disimpan dimatrix[0][0]
.Atau, jika Anda benar-benar menyukai kata kerja,
C # (Visual C # Compiler) ,
97 + 13 = 1107869 byteCobalah online!
32 byte disimpan dengan menggunakan fungsi yang telah ditentukan, karena tidak mengambil fungsi sebagai parameter diperbolehkan menghapus
System
impor danFunc
tipe generik panjang .sumber
catch(Exception e)
bukancatch
. :) EDIT: Oh, bisa mengganticatch(Exception e)
denganfinally
untuk menghemat lebih banyak byte. Terima kasih lagi. +1 dari saya.finally
menjadicatch(Exception e)
, karena saya tidak akan kembali ke dalam lagi. Jadim->{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 inim->{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.JavaScript,
61575652504442 byteMengurangi 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.Uji Kasus
sumber
APL NARS, 20 byte, 10 karakter
uji:
sumber
Jelly , 5 byte
Kiri ke kanan.
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.sumber
Clojure, 30 byte
Mengurangi "dari kiri".
sumber
Ruby ,
5553 byteCobalah online!
sumber