Disajikan untuk menghormati APL sebagai alat interaktif yang berusia 50 tahun tahun ini
Latar Belakang
Ken [Iverson] mempresentasikan makalahnya Formalisme dalam Bahasa Pemrograman pada Agustus 1963 pada Konferensi Kerja tentang Struktur Bahasa Mekanik, Princeton, NJ. (Backus, Kari, Dijkstra, Floyd, Iverson, Newell, Perlis, Wilkes). Makalah ini juga mencatat diskusi yang terjadi setelah presentasi, berakhir dengan pertukaran antara Ken dan [Edsger] Dijkstra , di mana jawaban Ken untuk pertanyaan Dijkstra adalah satu kalimat.
Tantangan
Bagaimana Anda mewakili operasi yang lebih kompleks, misalnya, jumlah semua elemen dari matriks M yang sama dengan jumlah dari indeks baris dan kolom yang sesuai?
Tulis cuplikan atau ungkapan (tidak perlu program atau fungsi penuh) untuk menghitung jumlah setiap elemen dalam matriks bilangan bulat yang diberikan yang sama dengan jumlah indeksnya. Atau, seperti dikatakan oleh FryAmTheEggman: diberi matriks M dengan elemen a ij kembalikan jumlah masing - masing a ij di mana a ij = i + j.
Anda dapat mengasumsikan matriks sudah berada di lokasi variabel atau memori, atau Anda dapat menganggapnya sebagai argumen atau input. Anda dapat menggunakan indeks berbasis 0 atau 1.
Uji kasus
0
untuk matriks kosong
2
0
untuk 0 indeks berbasis atau 2
untuk berbasis 1
1 5 2
9 4 2
5 9 6
2
untuk 0 berbasis atau 10
1 berbasis
0 3 0 4
0 4 1 4
4 3 1 2
-2 4 -2 -1
11
3 -1 3 3
3 -1 3 1
6
untuk 0 berbasis atau 3
1 berbasis
Anekdot
Jawaban Iverson adalah ++ / ( M = ⍳ ¹ ⨢ ⍳ ¹) // M , yang tidak valid dalam Notasi Iverson sebagaimana didefinisikan dalam Bahasa Pemrograman A , atau dalam apa yang akhirnya menjadi APL. Dalam notasi Iverson, itu akan menjadi + / ( M = ⍳ ¹ ( μ ( M )) ⨢ ⍳ ¹ ( ν ( M ))) / M . Dalam versi pertama APL itu +/(,M=(⍳1↑⍴M)∘.+⍳1↓⍴M)/,M
.
Jawaban:
APL,
1312 byte1 byte terima kasih kepada @ jimmy23013.
1-diindeks.
Array disimpan dalam variabel
m
.Cobalah online!
Berdasarkan jawaban dalam J , yang merupakan bahasa berdasarkan APL.
Di TryAPL, untuk memasukkan:
+/m`em`c`1+/`1`i`rm
Dengan array:
+/m`em`c`1+/`1`i`rm `[ 2 4 `r 3 `21 3 3 3 `21 3 1
Penjelasan
sumber
`
berarti "kunci APL".+/∊m∩¨+/¨⍳⍴m
.MATL ,
151410 byteInput memiliki baris yang dipisahkan oleh
;
. Sebagai contoh:[1 5 2; 9 4 2; 5 9 6]
. Pengindeksan berbasis 1 digunakan.Cobalah online! Atau verifikasi semua kasus uji .
Penjelasan
Saya akan menggunakan contoh dengan input
[3 -1 3 3; 3 -1 3 1]
dalam penjelasan.sumber
JavaScript,
4946 byteSunting: Disimpan 3 byte berkat @MartinEnder menunjukkan bahwa snippet diperbolehkan.
sumber
Retina , 46 byte
Hitungan byte mengasumsikan penyandian ISO 8859-1.
Input menggunakan pemisah spasi dan linefeed untuk merepresentasikan matriks. Indeks berbasis 0.
Cobalah online!
Penjelasan
Bukan jenis tantangan yang dibuat untuk Retina, tapi ternyata berhasil dengan baik ... :)
Tahap 1: Substitusi
Ini hanya memperluas semua bilangan bulat dalam string sebagai angka unary menggunakan
1
sebagai digit unary. Angka negatif seperti-3
hanya akan menjadi hal-hal seperti-111
.Tahap 2: Cocokkan
Karena
!
opsi, ini mencetak semua kecocokan dari regex yang diberikan. Regex tersebut menggunakan grup penyeimbang untuk memeriksa apakah angka saat ini sama dengan jumlah indeksnya.Untuk melakukan itu, pertama-tama kita menentukan jumlah indeks dengan tampilan di belakang
(?<=(\S* |.*¶)*)
. Ini menambahkan satu tangkapan untuk setiap angka di depan yang sekarang pada baris yang sama (via\S*
) serta satu tangkapan untuk setiap baris di depan yang saat ini (via.*¶
) ke grup1
. Karenanya, kami mendapatkan jumlah indeks berbasis nol sebagai hasilnya.Kemudian kami mencoba mencocokkan seluruh nomor berikutnya sambil menghapus tangkapan dari tumpukan ini
(?<-1>1)+\b
. Dan kemudian kami membuat pertandingan gagal jika ada tangkapan tersisa di grup1
dengan(?(1)1)
untuk memastikan kesetaraan.Perhatikan bahwa angka negatif tidak pernah cocok, karena tampilan di belakang tidak dapat melewati bagian
-
depan daftar1
dan(?<-1>1)+
tidak dapat mencocokkannya juga.Ini memberi kita daftar semua angka unary yang sama dengan jumlah indeks mereka.
Tahap 3: Cocokkan
Kami mengakhiri dengan tahap pertandingan lain, tetapi tanpa
!
opsi, ini hanya menghitung jumlah pertandingan, yang keduanya menjumlahkan semua angka unary dari hasil sebelumnya dan juga mengkonversi jumlah itu kembali ke desimal.sumber
Jelly,
151410 byte4 byte terima kasih kepada Adnan.
1-diindeks.
Cobalah online!
Verifikasi semua testcans sekaligus. (Sedikit dimodifikasi.)
sumber
J€
bukanL€R€
?Python 2 -
6057 byteIni adalah potongan kode, jadi itu akan menjadi beberapa byte lagi jika saya benar-benar mengembalikan nilainya, saya kira.
e=enumerate;sum(i*(x+y==i)for x,r in e(a)for y,i in e(r))
Terima kasih atas bantuan Leaky Num :-)
Penjelasan cepat.
a
adalah nomor memegang array. Lakukan iterate melalui indeks dan jumlahkan semua nilai yang nilainya sama dengan jumlah indeks.sumber
e=enumerate;sum(i*(x+y==i)for x,r in e(a)for y,i in e(r))
R, 24 byte
Berbasis 1.
Kasus uji:
sumber
J, 15 byte
Menggunakan nol berbasis pengindeksan dan mengasumsikan matriks sudah tersimpan dalam variabel M .
Penjelasan
sumber
CJam,
232120 byteTerima kasih kepada Peter Taylor untuk menghemat 3 byte.
Mengharapkan matriks berada di tumpukan dan meninggalkan jumlah sebagai gantinya. Indeks berdasarkan nol dalam kedua kasus.
Uji di sini.
sumber
_,,
alih - alih bagian dalamee
dan.
untuk loop dalam:ee{~_,,@f+1$.=.*~}%1b
ee{~_@f-_,,.=.*~}%1b
k4, 24 byte
Mengasumsikan matriks disimpan di
m
.Ini adalah salah satu teka-teki di mana penyederhanaan yang terlibat dalam merancang k dari APL (dan J) benar-benar menyakitkan — k's
!
adalah setara dengan APL⍳
tetapi hanya bekerja pada vektor, jadi saya harus merakit sendiri matriks indeks; produk dalam adalah satu karakter dalam APL tetapi lima dalam k; dan saya kehilangan tiga karakter untuk menangani matriks kosong dengan benar karena k tidak memiliki matriks yang sangat diketik.sumber
Pyth, 14 byte
Diindeks 0.
Suite uji.
sumber
PowerShell v2 +, 43 byte
Sebagai cuplikan. Penggunaan adalah untuk secara eksplisit menyalurkan matriks ke ini (lihat contoh di bawah). Asumsikan itu
$i
, dan$o
nol atau nol di awal (saya sudah secara eksplisit mengaturnya seperti pada contoh di bawah), dan menggunakan 0-index.Apakah loop foreach pada setiap baris matriks. Kami menetapkan
$j
ke0
, dan kemudian pergi melalui setiap elemen dari baris di loop lain$_|%{...}
. Setiap loop dalam, kita bertambah$o
dengan elemen saat ini dikalikan dengan Boolean($_-eq$i+$j++)
, artinya jika Boolean itu$TRUE
, itu akan menjadi1
, sebaliknya0
. Kemudian kita keluar dari lingkaran dalam, kenaikan$i
, dan mulai baris berikutnya. Akhirnya, kami meninggalkan$o
jalur pipa di akhir.Contohnya
sumber
Ruby, 63 byte
Dengan z sebagai susunan angka dua dimensi:
Sama sekali tidak mengasyikkan.
Jika z adalah array yang diratakan dengan x dan y yang memiliki ukuran array, seperti:
Lalu kita memiliki monster ini - mungkin lebih ruby-ish dengan produk mewah dan resletingnya, tetapi sebenarnya lebih besar:
sumber
Sebenarnya, 21 byte
Cobalah online!
Terima kasih kepada Leaky Nun karena membuatku berhenti malas dan akhirnya menulis ini.
Ini menggunakan matriks 0-diindeks, dan mengambil input sebagai daftar bersarang.
Penjelasan:
sumber
Matlab / Oktaf, 48 byte
1-diindeks.
Tidak akan menangani test case pertama karena
[1:0]
memiliki ukuran 1x0 untuk beberapa alasanDiuji dalam Oktaf 3.
Program lengkap:
sumber
sum((M.*(M-[1:size(M,1)]'-[1:size(M,2)]==0))(:))
. Juga, saya pikir Anda dapat mengubah==0
dan menginisialisasi~
untuk lebih mengurangi jumlah byte. Akhirnya, perhatikan bahwa Anda harus menangani semua kasus uji atau pertanyaan itu harus dihapusLua, 70 byte
1-diindeks.
Bonus: berfungsi untuk array yang tidak rata!
Input tersimpan
a
, keluaran disimpans
.Program lengkap:
sumber
PHP, 59 byte
mengharapkan array $ a didefinisikan; harus kosong atau 2 dimensi, diindeks 0.
menghitung jumlah $ s (sebelumnya 0 atau tidak terdefinisi - 0 sama dengan NULL)
masukkan
+2
sebelum akhir)
untuk perilaku 1-diindeksSelamat Ulang Tahun APL!
fungsi dan test suite
sumber
Brachylog , 15 byte
Cobalah online!
sumber
Bahasa Wolfram (Mathematica) , 42 byte
Cobalah online!
1-diindeks.
sumber