Saya memulai satu tantangan golf kode baru-baru ini dan sepertinya pemenangnya adalah GolfScript (kejutan, kejutan!). Yang menarik adalah bahwa ada pesaing lain yang sangat kuat yang memiliki semua peluang untuk menang atas GolfScript. Namanya APL. Saya melihat banyak jawaban tertulis di APL di sini. Sepertinya bahasa ini cukup efisien untuk golf code, jadi saya memutuskan untuk meminta tips golf code yang Anda tahu untuk program APL. Jangan ragu untuk mengirim beberapa contoh kode. Biasanya sangat menarik untuk melihat bahasa beraksi.
Kereta
sumber
Trik untuk berurusan dengan
/
dan⌿
di keretaSaat menggunakan kereta, Anda mungkin ingin menggunakan pengurangan
f/
seperti jumlah+/
atau bahkan mereplikasi pengurangan//
. Namun, jika kereta Anda memiliki lebih banyak bagian di sebelah kiri reduksi, Anda memerlukan tanda kurung untuk membuat puncak. Berikut adalah beberapa trik untuk menghemat byte.Gunakan
1∊
sebagai ganti monadik∨/
atau∨⌿
pada array BooleanTugas: Diberikan dua string sama panjang A dan B, kembalikan 2 jika ada karakter yang sesuai dari A dan B sama, 0 sebaliknya Misalnya
A←'abc'
danB←'def'
memberikan0
danA←'abc'
danB←'dec'
memberi2
.Solusi dfn mungkin
A{2×∨/⍺=⍵}B
tetapi Anda ingin mempersingkat dengan pergi diam-diam.A(2×∨/=)B
tidak akan bekerja karena aturan pembentukan kereta mengurai ini2 (× ∨/ =)
tetapi Anda inginkan2 × (∨/=)
.Perhatikan itu
∨/
atau∨⌿
pada vektor Boolean (∨/,
atau∨⌿,
untuk array peringkat yang lebih tinggi) menanyakan apakah ada 1 hadiah, yaitu1∊
, sehingga kita dapat menulis kereta kita sebagai2×1∊=
.Perhatikan bahwa
∊
mengecilkan argumen yang benar, sehingga Anda tidak dapat menggunakannya untuk mengurangi setiap baris atau kolom secara terpisah.Gunakan
1⊥
sebagai ganti monadik+/
atau+⌿
Tugas: Diberikan daftar daftar L dan indeks N, kembalikan tiga kali lipat dari jumlah daftar N. Misalnya
L←(3 1 4)(2 7)
danN←1
memberi24
.Solusi dfn mungkin
N{3×+/⍺⊃⍵}L
tetapi Anda ingin mempersingkat dengan pergi diam-diam.N(3×+/⊃)L
tidak akan bekerja karena aturan pembentukan kereta mengurai ini3(× +/ ⊃)
tetapi Anda inginkan3 × (+/⊃)
.Perhatikan bahwa mengevaluasi daftar angka di unary (basis-1) sama dengan menjumlahkan daftar karena  { a , b , c , d } = a + b + c + d = ( a × 1³) + ( b × 1² ) + ( c × 1¹) + ( d × 1⁰). Oleh karena
+/a b c d
itu sama dengan1⊥a b c d
, dan kita dapat menulis kereta kita sebagai3×1⊥⊃
.Perhatikan bahwa pada argumen peringkat yang lebih tinggi,
1⊥
setara dengan+⌿
.Gunakan
f.g
alih-alihf/g
dengan skalar dan / atau argumen vektorTugas: Diberikan daftar L dan angka N, kembalikan kisaran 1 dengan teliti jumlah sisa pembagian minimum saat elemen L dibagi dengan NEg
L←31 41 59
danN←7
beri1 2 3
.Solusi dfn mungkin
N{⍳⌊/⍺|⍵}L
tetapi Anda ingin mempersingkat dengan pergi diam-diam.N(⍳⌊/|)L
tidak akan bekerja karena aturan pembentukan kereta menguraikan ini sebagai⍳ (⌊/) |
tetapi Anda inginkan⍳ (⌊/|)
.Produk dalam
A f.g B
skalar dua berfungsi ketika argumennya skalar dan / atau vektor sama denganf/ A g B
karena keduanya(A[1] g B[1]) f (A[2] g B[2]) f (A[3] g B[3])
dll, sehingga kita dapat menulis kereta kita sebagai⍳⌊.|
.Perhatikan bahwa ini tidak berfungsi untuk array peringkat lebih tinggi.
Menggunakan
∊⊆
alih-alih/
dengan argumen kanan kanan Boolean dan vektor kananTugas: Diberikan daftar L dan angka N, filter daftar sehingga hanya angka yang lebih besar dari N yang tersisa. Misalnya
L←3 1 4
danN←1
memberi3 4
.Solusi dfn mungkin
N{(⍺<⍵)/⍵}L
tetapi Anda ingin mempersingkat dengan pergi diam-diam.N(</⊢)L
tidak akan berfungsi karena aturan yang mengikat akan menguraikan ini(</) ⊢
tetapi Anda ingin/
menjadi fungsi mereplikasi daripada mengurangi operator .Diadik
⊆
dengan argumen kiri Boolean mempartisi argumen yang benar sesuai dengan run 1s di argumen kiri, menjatuhkan elemen yang ditunjukkan oleh 0s. Ini hampir apa yang kita inginkan, simpan untuk partisi yang tidak diinginkan. Namun, kita dapat menyingkirkan partisi dengan menerapkan monadik∊
. Dengan demikian{(⍺<⍵)/⍵}
dapat menjadi{∊(⍺<⍵)⊆⍵}
dan dengan demikian kita dapat menulis kereta kita sebagai∊<⊆⊢
.Perhatikan bahwa ini tidak berfungsi untuk array peringkat lebih tinggi.
Gunakan
0⊥
sebagai ganti⊢/
atau⊢⌿
dengan argumen numerikTugas: Diberikan daftar L dan angka N, kalikan N dengan elemen paling kanan dari LEg
L←3 1 4
danN←2
beri8
.Solusi dfn mungkin
N{⍺×⊢/⍵}L
tetapi Anda ingin mempersingkat dengan pergi diam-diam.N(⊣×⊢/⊢)L
tidak akan bekerja karena aturan pembentukan kereta mengurai ini⊣ (× ⊢/ ⊢)
tetapi Anda inginkan⊣ × (⊢/⊢)
.Perhatikan bahwa
0⊥
pada array numerik sama dengan⊢⌿
, jadi kita bisa menulis kereta kita sebagai⊣×0⊥⊢
.Perhatikan bahwa ini memilih sel utama terakhir dari array peringkat yang lebih tinggi.
sumber
Gunakan
⊥
untuk menggabungkan multiplikasi dengan tambahanAsumsi:
a
danb
adalah istilah yang tidak memerlukan tanda kurung lebih lanjut ketika digunakan sebagai argumen kiriC
adalah ekspresi yang mungkin membutuhkan tanda kurung ketika digunakan sebagai argumen kiria
b
C
mengevaluasi skalar numeriksumber
Bilangan kompleks
Seringkali diabaikan, mereka menghadirkan peluang bagus untuk mempersingkat ekspresi yang berhubungan dengan kisi, labirin, fraktal, atau geometri.
sumber
Pengindeksan panjang vektor modulo
⊃i⌽a
sering lebih pendek dari naif⊃a[(≢a)|i]
ataua⊃⍨i|⍨≢a
(di manaa
vektor dani
bilangan bulat, dan⎕io
0)variasi yang berguna untuk ini (terima kasih EriktheOutgolfer untuk menunjukkan) adalah: di
I↑Y⌽⍨I×X
manaY
adalah gabungan dari beberapaI
vektor panjang danX
merupakan indeks dari yang ingin kita pilih, misalnya:3↑'JanFeb...Dec'⌽⍨3×month
sumber
Fungsi konstan
=⍨
dan≠⍨
terima kasih kepada ngn.Terkadang Anda hanya perlu satu nilai untuk setiap elemen daftar. Meskipun Anda mungkin tergoda untuk menggunakannya
{value}¨
, ini lebih pendek untuk digunakanvalue⊣¨
tetapi untuk beberapa nilai umum, Anda bisa menjadi lebih pendek (menggunakan⎕IO←0
):¯1
dengan⍬⍸list
0
dengan⍬⍳list
1
dengan⍬⍷list
Perhatikan bahwa ini hanya berfungsi pada daftar (meskipun mungkin bersarang). Untuk array peringkat yang lebih tinggi, Anda dapat menggunakan yang berikut untuk mendapatkan semua 0s dan semua 1s:
1
dengan=⍨
0
dengan≠⍨
Jika Anda mengatur
⎕ML←0
, semua angka dapat dibuat menjadi nol (seolah-olah0×
) dengan:∊
Jika Anda hanya membutuhkan satu nomor, Anda dapat menggunakan monadik
≡
untuk mendapatkan 1 atau 0 alih-alih menggunakan1⊣
atau0⊣
.sumber
⊣\
⊣
dan⊢
dengan/
dan⌿
pantas posting mereka sendiri.Menggunakan
⍨
Hindari tanda kurung
⍨
(Perjalanan) dapat menghemat byte dengan menghindari tanda kurung. Setiap kali Anda memiliki fungsi di mana argumen kiri harus di kurung dan argumen kanan tidak, Anda dapat menyimpan byte, misalnya(A<B)÷C
→C÷⍨A<B
.Array ganda
Untuk menambahkan salinan array hingga akhir, gunakan
,⍨A
atau⍪⍨A
.Angka ganda
Alih-alih menggunakan
2∘×
untuk menggandakan, Anda dapat menggunakan+⍨
karena menambahkan argumen itu sendiri:1+2∘×
→1++⍨
.Angka kuadrat
Alih-alih menggunakan
2*⍨Y
to square, Anda dapat menggunakan×⍨Y
karena itu mengalikan argumen dengan dirinya sendiri:2*⍨A+B
→×⍨A+B
.Permutasi acak
?⍨N
akan memberi Anda permutasi acak panjangN
.Klasifikasi sendiri
Temukan indeks kemunculan pertama setiap sel utama
⍳⍨A
Hitung trailing 1s dalam vektor Boolean
Alih-alih
+/∧\⌽B
menghitung berapa banyak trailing 1s di dalamnya yangN
dapat Anda gunakan⊥⍨
.Komposisi terbalik
A f∘g B
adalahA f g B
, tetapi jika Anda ingin(g A) f B
, gunakanf⍨∘g⍨
.Mengurangi mundur
f/ a1 a2 a3
adalaha1 f (a2 f a3)
. Jika Anda ingin(a1 f a2) f a3
, gunakanf⍨/⌽
.Pemindaian terbalik
f\ A B C
adalahA (A f B) (A f (B f C))
.f⍨/∘⌽¨,\ A B C
adalahA (A f B) ((A f B) f C)
.f⍨\⌽ A B C
adalah((A f B) f C) (B f C) C
.⌽f/∘⌽¨,\⌽ A B C
. adalah(A f (B f C)) (B f C) C
.sumber
Hitung karakter dalam string tanpa
⍳≢
Tugas: Diberikan dua string, S dan T, daftar indeks gabungan mereka. Misalnya
S←'abcd'
danT←'xyz'
memberi1 2 3 4 5 6 7
.Solusi dfn mungkin
S{⍳≢⍺,⍵}T
tetapi Anda ingin mempersingkat dengan pergi diam-diam.⍳≢,
tidak akan berfungsi karena aturan parsing kereta akan menguraikan ini seperti yang(⍳)≢(,)
Anda inginkan(⍳≢),
.Diad
⍋
dengan argumen kiri kosong menilai array karakter sederhana menurut urutannya saat ini, yang sama dengan⍳≢
. Dengan demikian{⍳≢⍺,⍵}
dapat menjadi{⍬⍋⍺,⍵}
, sehingga kita dapat menulis kereta kita sebagai⍬⍋,
.Perhatikan bahwa ini tidak berfungsi untuk array numerik atau campuran.
sumber