Tips untuk bermain golf di J

33

GolfScript mendapatkan caranya sendiri terlalu sering dan saya merasa bahwa repositori petunjuk praktis untuk bermain golf di J dapat membantu dalam perang melawan kekaisaran jahat. Kiat apa yang Anda miliki untuk membuat bahasa yang sudah singkat ini lebih pendek?

Bagi mereka yang ingin belajar J, tempat yang jelas untuk memulai adalah situs jsoftware dan khususnya kosakata , panduan Learning J dan panduan programmer J untuk C.

Gareth
sumber
1
Ada sesuatu yang lucu tentang membaca GolfScript gets its own way far too oftenpada tahun 2019.
String tidak terkait

Jawaban:

14

Ada beberapa seluk-beluk untuk memeras beberapa karakter terakhir dalam J. Untuk yang berikut, asumsikan bahwa setiap huruf kapital adalah kata kerja primitif (yaitu saya menghilangkan spasi yang seharusnya diperlukan untuk membatasi nama).

  • Ketika Anda memiliki kereta pergi, dan Anda perlu menerapkan fungsi di atas bagian lain, ([:FLGR)dan (LF@:GR)memiliki jumlah karakter yang sama, tetapi (LF@GR)menyimpan satu. Jika kerangka G lebih besar dari atau sama dengan peringkat monad F, ini adalah transformasi yang valid. Khususnya, semua kereta memiliki peringkat yang tak terbatas, seperti halnya , ,. ,: ~. /: \: [ ]dan sebagian besar menggunakan #dan |..

  • Jika Anda harus memilih string dari daftar, dan string ini tidak memiliki spasi, gunakan >i{ab`cd`ef. Itu kotor, tetapi menyimpan karakter untuk setiap string baru yang harus Anda tangani, kecuali Anda hanya menarik karakter tunggal, dan bahkan kemudian charlist harus panjang 4 agar lebih pendek. Apa yang terjadi adalah bahwa nama-nama yang tidak didefinisikan diperlakukan sebagai referensi untuk kata kerja, dan ketika Anda mengambil gerunds dari kata kerja itu Anda mendapatkan string kotak nama. Setiap nama yang sudah didefinisikan memiliki noun type, kata keterangan, atau kata sambung tidak dapat digunakan dengan cara ini, karena nama-nama itu diselesaikan sebelum `dapat memiliki mereka.

  • Jika Anda cukup beruntung untuk memiliki ekspresi untuk bekerja dengan dan bukan hanya kata kerja diam-diam, itu hampir selalu layak untuk menetapkan bit yang Anda gunakan kembali ke variabel, baik itu kata benda, kata kerja, atau kata keterangan. Para orangtua kadang-kadang akan membayar sendiri dengan memasukkan tepat ke tempat Anda memiliki ruang sebelumnya, dan sebagian besar definisi seperti itu layak jika mereka digunakan kembali bahkan sekali lagi.

  • Konjungsi seperti (FGH)^:(u`v`w)dapat ditulis ulang u`v`w(FGH^:). Ini bisa digunakan untuk semua lamanya kereta, bahkan 1, meskipun Anda hanya menyimpan apa pun jika trik ini menghilangkan parens dari argumen yang benar. Trik ini hanya berfungsi ketika Anda melakukan preload operan kiri. (Tidak tahu apa yang baru saja terjadi? Cari 'tacit adverbs', dan pelajari bagian Parsing and Execution dari J Dictionary.)

  • Jangan gunakan a.&i., gunakan u:! {&a.dan 3&u:sama panjangnya, dan yang pertama mungkin lebih berguna dalam konjungsi (tergantung pada konjungsi).

  • Hal-hal seperti (2%~F)dan (F%2:)panjangnya setara. Ini berguna karena kadang-kadang, tergantung pada apa yang tampak seperti sisa kereta Anda, Anda dapat menyusunnya kembali dengan @trik seperti yang tertulis di poin pertama, untuk menyelamatkan beberapa karakter yang putus asa. (Dan tentu saja, jika Fada ]dan kereta api adalah monad, menggunakan %&2menghemat char, ya.)

  • Kereta seperti kait dengan ]atau [sebagai kata kerja paling kiri, mis (]FGH).

    • ]memungkinkan Anda memecah aplikasi diad dan hanya menggunakan argumen yang tepat. (Bertukar ke kiri dengan (]FGH)~, hukuman minimal 1 karakter, mungkin lebih.) Menghemat char (FGH)@], dan sangat berguna dalam gerunds!
    • [dalam hook yang diterapkan secara monad memungkinkan Anda melakukan sesuatu untuk efek samping di sisi kanan, lalu kembalikan argumennya. Penggunaan paling umum adalah dengan 1!:2, mungkin dengan memformat sampah.
  • Saya / O menyebalkan. Percepat proses dengan membuat loop dari semua yang Anda bisa. 1!:1memiliki peringkat 0, dan keduanya 1!:2 3memiliki peringkat _ 0, misalnya, jadi gunakan ini dengan membuat array 1s dan menabrak 1!:1mereka secara langsung. Perhatikan bahwa ".juga memiliki peringkat 1, jadi Anda biasanya bisa langsung memasukkannya setelah 1!:1itu, dan tidak harus melampirkannya melalui @atau peringkat shenanigans.

  • Tidak mudah menemukan tempat untuk meletakkan ini, tetapi ::dapat bermanfaat.

    • ::]^:_adalah kombinasi yang sangat kuat, misalnya, yang memungkinkan Anda melakukan sesuatu yang berbahaya sampai Anda tidak dapat melakukannya lagi. (Tunduk pada ^:_peringatan -as-a-loop biasa.)

    • Ini juga memungkinkan Anda menggunakan {daftar yang tidak memiliki indeks yang diinginkan, karena itu membuat kesalahan domain ketika itu terjadi. Berguna untuk misalnya mengambil kepala daftar hanya jika ada (coba gunakan ::]untuk mengembalikan daftar kosong, atau ::_1:untuk mengembalikan kode kesalahan, dan sebagainya).

  • ]`($:@u)@.vbiasanya dapat dibuat lebih pendek dari u^:v^:_, terutama pada definisi udan vyang bisa dimainkan. Kasus serupa berlaku untuk bersyarat seperti u^:(1-v)vs ]`[email protected]. Pertimbangkan opsi-opsi Anda, terutama ketika Anda memiliki banyak kata kerja bernama mengambang. Ini juga sedikit lebih fleksibel, tetapi ingat, jika menggunakan $:, ada kedalaman rekursi yang mudah ditabrak. (Biasanya sekitar 1800 iterasi?)

algoritme hiu
sumber
Trik yang merugikan benar-benar keren.
FUZxxl
"selamatkan beberapa karakter yang putus asa" Ketika Anda belajar menyalakan, semuanya tampak seperti julukan yang ditransfer! :)
Soham Chowdhury
1
"Menggunakan %&2menghemat char, ya." Dan -:menyimpan yang lain!
Lynn
11

Yang paling penting ketika bermain golf di J adalah tidak hanya memahami masalah, tetapi untuk mengurangi masalah menjadi serangkaian transformasi array. Anda perlu memahami cara berpikir ini untuk sukses dengan kode J.

Misalnya, tantangan terbaru diminta untuk memecahkan masalah subarray terbesar . Algoritma stok untuk mengatasi masalah ini adalah algoritma Kadane memiliki uraian informal berikut:

Pergi melalui array dan pada setiap posisi dan temukan jumlah dari subarray terbesar yang berakhir di sini, yang merupakan maksimum 0 atau nilai pada indeks saat ini ditambah jumlah dari subarray terbesar yang berakhir pada posisi sebelumnya. Hitung maksimum dari subarrays ini saat Anda pergi untuk menemukan subarray terbesar di seluruh array.

Terjemahan ke dalam kode imperatif sangat mudah:

  1. misalkan A menjadi array input.
  2. hmi ← 0.
  3. jika saya ≥ len (A) mengembalikan m .
  4. h ← maks (0, h + A [ i ]).
  5. m ← maks ( m , h ).
  6. ii +1.
  7. kebagian 3.

Algoritma ini tampaknya rumit untuk J secara sekilas karena ada loop eksplisit yang tidak terlihat seperti pengurangan pada awalnya. Jika Anda menyadari apa yang dilakukan algoritma, Anda dapat menguraikan langkah-langkah individual dan melihat bahwa itu benar-benar melakukan dua operasi array sederhana:

  1. Memindai melalui array untuk menghitung panjang subarrays terbesar yang berakhir pada setiap indeks.
  2. Kurangi panjang ini dengan fungsi maks untuk menemukan maksimum.

Sekarang kedua langkah ini sangat mudah diimplementasikan dalam J. Berikut ini adalah terjemahannya:

  1. (0 >. +)/\. y , 0- Langkah ini beroperasi dari ujung array agar lebih sesuai dengan paradigma J. 0 >. +adalah diam-diam untuk0 >. x + y .
  2. >./ y

Secara keseluruhan, kami mendapatkan implementasi algoritma yang sangat singkat:

>./ (0 >. +)/\. y , 0

Jika Anda mempelajari cara mendekati penerapan algoritma ini, solusi Anda akan sesingkat kode ini.

Berikut adalah beberapa trik yang saya kumpulkan dari waktu ke waktu. Daftar ini akan diperluas karena saya mendapatkan lebih banyak pengetahuan tentang golf.

  • Pelajari kamus. Ini mengandung banyak kata kerja yang benar-benar tidak jelas yang tidak masuk akal sampai Anda melihat betapa berharganya mereka. Misalnya, monadik= aneh pada awalnya tetapi sangat berguna dalam tantangan seni ASCII.
  • Gunakan diad &dalam konteks tersembunyi ketika Anda menginginkan konjungsi kekuatan. Kosa kata menyarankanu@[&0 sebagai pengganti diam-diam untuk 4 : 'u^:x ydan aku juga.
  • Dalam banyak kasus, Anda dapat menghindari [:atau @:dalam urutan seperti u@vdengan memilih varian uyang memiliki argumen kiri. Misalnya, untuk menghapus item pertama dari hasil v, gunakan 1}.valih-alih [:}.vjika }.@vtidak mungkin karena alasan tertentu.
  • ] vseringkali lebih pendek daripada v@]jika Anda ingin menggunakan monadik vdalam konteks diad. Ini sangat berguna terutama ketikav kata kerja panjang.
  • Kadang-kadang Anda dapat menulis m (n v w) ybukan(n v m&w) y . Ini memungkinkan untuk menghindari spasi dan tanda kurung.
  • #\ dari pada >:@i.@# .
  • u &. vberguna ketika vmemiliki bagian depan. Bila tidak, Anda mungkin ingin menggunakannya[: vinv u & v atau u & (v :. vinv)sebagai gantinya.
  • Memahami peringkat dan cara menggunakannya. Cobalah untuk bermain-main dengan pangkat bersama sampai Anda mendapatkan sesuatu yang cocok. Ini membantu memahami bagaimana peringkat mempengaruhi kode Anda.
  • ^:_ sangat berguna untuk algoritma di mana Anda ingin mencapai konvergensi, seperti mengisi banjir atau simulasi.
  • Ketahui perpustakaan standar Anda. Ini berisi fungsi yang sangat berguna yang menghemat banyak karakter.
  • Kopula =.dan=: dapat disematkan di mana saja dalam frasa. Gunakan ini untuk membuat satu baris di mana notasi diam-diam tidak cukup.
  • Gunakan monadik , alih-alih beberapa pengurangan saat mengurangi array multi-dimensi.
  • Memahami frasa apa yang didukung oleh kode khusus ketika tantangan memaksakan batas runtime. Beberapa hal berguna beroperasi dalam O ( n ), bukan O ( n 2 ) secara intuitif.
  • Kotak berguna untuk pohon.
FUZxxl
sumber
Apakah J cukup pintar untuk menjalankan solusi subarray maks Anda di O (n) dengan caching perhitungan yang digunakan kembali, atau akankah ia melakukan hal yang mudah dan menjalankannya dalam O (n ^ 2)?
Jonah
@ Jonah saya pikir ini berjalan dalam waktu kuadratik.
FUZxxl
10

Berhati-hatilah menggunakan loop.

Sementara J memiliki struktur pengulangan ( for. do. end., while. do. end.dan variasi), jika Anda mendapati diri Anda menggunakannya, ada kemungkinan bahwa algoritme Anda tidak sesuai dengan kekuatan golf J dan ada penghematan karakter yang harus dilakukan.

^:konjungsi kekuatan adalah teman Anda. Untuk menjalankan kata kerja xkali:

verb^:x

Jika Anda membutuhkan hasil setiap iterasi dalam daftar:

verb^:(i.x)

Anda juga dapat menggunakan ^:untuk mengeksekusi kata kerja dengan syarat:

  +:^:(3<])"0[ 1 2 3 4 5 6
1 2 3 8 10 12

Gandakan +:jika ^:item lebih besar dari 3 3<]( "0perubahan peringkat kata kerja sehingga item bekerja pada suatu waktu).

Gareth
sumber
Nilai kotak bertindak seperti (i.x)contoh, yaitu f^:(<x)setara dengan f^:(i.x).
FireFly
9

Memasukkan

1!:1[1 akan mengambil satu baris input yang diakhiri dengan menekan tombol enter.

1!:1[3 akan mengambil sejumlah baris input (diakhiri oleh Ctrl-D di Mac saya, Ctrl-C di Windows).

Jika Anda mencoba memasukkan angka, menggunakan ".akan mengevaluasi string dan mengembalikan daftar angka yang siap dimanipulasi. Jika Anda menerima satu nomor tetapi harus beroperasi pada digit satu per satu, ".,.(terima kasih atas komentar Jan Dvorak untuk ini) atau "."0akan membagi string menjadi digit yang terpisah:

   "."0[1!:1[1
12345
1 2 3 4 5

   ".,.1!:1[1
12345
1 2 3 4 5

Jika Anda membaca dalam string, cara terpendek untuk mendapatkan daftar string yang terpisah dari kotak adalah dengan menggunakannya ;:. Ini berfungsi paling baik untuk string yang dipisahkan ruang:

   ;:1!:1[1
hello world
┌─────┬─────┐
│hello│world│
└─────┴─────┘
Gareth
sumber
Karena penasaran, (saya hanya bermain dengan J sedikit) apa yang akan 1!:1[2berhasil (jika ada)?
Gaffi
Dari apa yang saya dapat kumpulkan di 1!:halaman (saya bukan ahli J) 2 adalah layar, jadi input dari layar tidak masuk akal.
Gareth
Terima kasih untuk tautannya. Dari sana, sepertinya benar-benar 2tidak valid? Saya tidak punya komputer J saya untuk mencobanya saat ini. Di mana saya melihat 2, tepat di bawah catatan tentang 1!:1, itu untuk 1!:2.
Gaffi
@ Gaffi Nomor file untuk input dan output tampaknya berurutan, jadi saya menduga bahwa mereka sudah diperbaiki dan bahwa 2, 4 dan 5 hanya muncul di bawah output karena tidak masuk akal untuk mencoba dan memasukkannya. Hal yang sama berlaku sebaliknya untuk 1 dan 3.
Gareth
Karena ".peringkat 1-xx dan ,.selalu menghasilkan array 2D, ".,' ',.(menjahit dengan spasi, ravel dan evaluasi; 8 karakter) dapat diganti dengan adil ".,.(ravel item dan evaluasi; 4 karakter).
John Dvorak
6

Menggunakan iterasi untuk menghitung urutan

Biasanya, menyelesaikan tantangan urutan OEIS akan membutuhkan penggunaan salah satu formula yang diberikan pada halamannya. Beberapa di antaranya beradaptasi dengan baik untuk J, dan yang lain tidak begitu banyak. Rumus rekursif bersifat langsung, namun iterasi mungkin tidak sederhana. Pola yang mulai saya gunakan adalah

(s(]f)^:[~]) n
          ]  Gets n
 s           The first value in the sequence
         ~   Commute the argument order, n is LHS and s is RHS
        [    Gets n
      ^:     Nest n times with an initial argument s
  (]f)         Compute f s
             Returns (f^n) s

di mana sadalah nilai pertama dalam urutan, fadalah kata kerja yang akan menghitung istilah berikutnya yang diberikan istilah sebelumnya, dan nmerupakan indeks berbasis nol dari istilah yang ingin Anda hitung. Metode ini bergantung pada fakta bahwa ketika menghitung kekuatan angka dua, LHS terikat pada angka dua untuk membentuk monad baru, dan bahwa monad bersarang pada nilai awal. Angka dua yang diberikan pada keterangan daya adalah sebuah kait di mana (]f)diberikan indeks npada LHS dan nilai suatu istilah dalam urutan s. Hook akan berlaku fpada ssebagai monad, dan kemudian mengabaikan nuntuk mengembalikan hasil f s.

Perpustakaan standar

Terkadang, Anda mungkin menemukan bahwa J akan memiliki dukungan untuk kata kerja di perpustakaan standarnya . Sebagai contoh, sebagian besar operasi integer bitwise terikat pada nama yang lebih pendek daripada menggunakan panggilan primitif.

AND =: (17 b.) NB. it is actually '$:/ :(17 b.)'

Tanggal dan waktu bawaan juga tersedia.

Kisaran

Jika Anda memiliki seperangkat nilai [a, b, c]dan Anda ingin membentuk rentang berdasarkan pada produk mereka seperti [0, 1, 2, ..., a*b*c-1], pendekatan khas akan menemukan produk mereka dan kemudian membentuk rentang yang mungkin [:i.*/biaya 6 byte. Cara yang lebih pendek adalah ,@i.untuk 4 byte sejak itui. dapat membentuk array multidimensi sambil tetap menghitung, dan meratakannya akan menghasilkan kisaran yang setara.

Mencetak terus menerus

Cara diam-diam untuk mencetak nilai dan terus menggunakannya tanpa loop eksplisit adalah ([echo)untuk kasus monadik. echoadalah kata kerja di perpustakaan standar yang mencetak isinya ke stdoutdalam format yang sama yang digunakan dalam penerjemah. Pengait kemudian mengeluarkan nilai input yang sama menggunakan [kata kerja kiri .

Basis 10 digit bilangan bulat

Cara standar untuk memperoleh basis 10 digit integer adalah 10#.inv]yang menghabiskan biaya 8 byte, terlalu banyak! Alternatifnya adalah mengonversinya menjadi string dan menguraikannya pada peringkat 0 "."0@":yang menyimpan byte, tetapi cara yang lebih baik adalah ,.&.":yang menyimpan byte lain yang membuat biaya akhir 6 byte bukannya 8.

mil
sumber
5

Pertimbangkan untuk menggunakan definisi eksplisit alih-alih menulis kata kerja diam-diam; Pastikan 3 :'dan 'biaya 5 byte, tetapi Anda dapat menyimpan banyak @, @:dan dengan [:cara itu.

Omar
sumber
5

Beberapa (cukup) trik umum yang pernah saya lihat

Saya berbagi beberapa hal yang berguna bagi saya. Pada dasarnya semua ini adalah tips yang saya terima sendiri, tetapi saya tidak memiliki kredit untuk sebagian besar.

Jumlah array peringkat satu

Alih-alih menggunakan +/@:(FGH)gunakan (1#.FGH). Ini berarti merendahkan ke basis 1, yang secara efektif berarti menjumlahkan array. Meskipun lebih panjang dari +/itu, tidak memerlukan penutup atau komposisi, yang sering membuatnya lebih pendek daripada menggunakan+/ .

Menghitung kebenaran yang tertinggal

Jika Anda memiliki daftar boolean dan Anda ingin menghitung jumlah trailing truth, gunakan #.~. Lihat di sini . The APL Jawaban memberikan penjelasan yang baik untuk bagaimana ini bekerja. Memang, ini hanya membantu saya dua kali tetapi saya pikir saya akan membagikannya.

Dibawah (&.)

Bukan trik khusus, tetapi hanya saran umum: kata keterangan &. -di bawahnya sering mengarah pada solusi pendek yang elegan dan (lebih penting). Ingatlah saat Anda bermain golf.

Sering kali ini berguna untuk tantangan konversi basis dan lainnya, mis. Kode ini yang menghilangkan bit paling signifikan dari suatu angka: }.&.#:(konversikan ke daftar digit biner, hapus digit pertama, lalu batalkan konversi ke daftar digit biner dan konversi kembali ke desimal). Solusi sederhana adalah dua byte lagi: #.@}.@#:.

Di bawah juga membantu untuk tantangan di mana Anda perlu bekerja dengan angka desimal, karena Anda dapat menggunakannya u&.":. Misalnya, cara singkat mil memberikan untuk membagi ke angka desimal menggunakan di bawah: ,.&.":.

Contoh terakhir adalah menemukan besarnya vektor:, +/&.:*:perhatikan bahwa Anda perlu mengumpulkan semua hasil dari *:-square dengan &.:-di bawah karena *:-square adalah peringkat nol.

cole
sumber
4

Cara yang lebih pendek untuk mengacaukan barisan

Terkadang, Anda akan memiliki kode seperti <"0 i.3 3, di mana Anda ingin menerapkan kata kerja vdi peringkat r. Namun, jika Anda menggunakan kata benda (seperti 0), Anda harus sering memasukkan spasi. Untuk menghindari ini, Anda dapat menggunakan kata kerja lain udengan peringkat yang setara dan menggunakan u"vsebagai gantinya. Misalnya, karena +memiliki peringkat 0 0 0, kita dapat menggunakannya <"+sebagai ganti<"0 .

Ini adalah tabel dari semua kata kerja dan peringkatnya (dapat diperoleh dengan menggunakan v b. 0):

0 0 0     > + * - % ^ | ! ? <. <: >. >: +. +: *. *: %: ^. j. o. q: r.
0 _ _     -. -: E. i: p:
1 0 1     p..
1 0 _     { A.
1 1 0     p.
1 1 1     #.
1 1 _     C.
1 _ _     ;: ". i. I.
2 _ 2     %.
_ 0 0     = < ~. ~: {: }: ?. L.
_ 1 0     #:
_ 1 _     $ # |. |: {. }. ": {::
_ _ _     , ; [ ] _: $. $: ,. ,: /: \: [: e. s: u: x: 0:

Untuk menggunakan tabel ini, temukan peringkat yang diinginkan rdi sisi kiri, lalu pilih kata kerja yang sesuai vdari sisi kanan. Misalnya, jika saya perlu membuat vektor kata kerja vdi kedalaman 2 _ 2, maka saya menemukan peringkat di sebelah kiri dan memilih %.dari kanan. Maka saya gunakan v"%.sebagai gantinya v"2 _ 2.

Conor O'Brien
sumber
3

strings perpustakaan: tips golf

Perpustakaan string sangat membantu untuk melakukan apa pun dengan manipulasi string. Tentu, dibutuhkan include'strings'(yang sangat mahal, mengingat J), tetapi Anda kadang-kadang dapat menuai manfaatnya.

stringreplace

Menemukan diri Anda menggunakan ganti string? Amati itu A stringreplace Bsama denganB rplc A .

Sebenarnya, ini cara rplcpenerapannya:

   rplc
 stringreplace~

cuts

Kata kerja tersebut cutsmenyediakan:

cut y at x (konjungsi)
teks string (kata kerja memotong n)
  n = _1 hingga tetapi tidak termasuk string
  n = 1 hingga dan termasuk string
  n = _2 setelah tetapi tidak termasuk string
  n = 2 setelah dan termasuk string

Jadi itu benar-benar mengiris string.

Conor O'Brien
sumber
3

Mendapatkan angka dari 0 hingga 4

Jika ada batasan dalam menggunakan angka dalam kode Anda:

0 %_ : satu dibagi dengan tak terbatas.
1 #_ : berapa banyak infinitas?
2 #_ _ : dua ketidakterbatasan.
3 verb : ada built-in.
4 dyad : built-in lainnya.

Mendapatkan angka dari 10 hingga 35

Literal dasar-inifinity: 11 : _bb, 26 : _bqdll

FrownyFrog
sumber
3

Pemrograman diam-diam

Dasar-dasar

Kata kerja diad

x (F G H) y == (x F y) G (x H y)
x (F G) y == x F (G y)
x ([: G H) y == G (x H y)  NB. G is called monadically

NB. Verbs are grouped from the right by units of 3.
NB. For the following, think like G, I, K are replaced by the results of (x G y) etc.
NB. and then the sentence is run as usual.
x (F G H I J K) y == x (F (G H (I J K))) y
                  == x F ((x G y) H ((x I y) J (x K y)))

NB. Using conjunctions for dyadic verb
x F@G y == F (x G y)  NB. Atop; Same as x ([: F G) y; Consider as golfing alternatives
x F&G y == (G x) F (G y)  NB. Compose; G is applied monadically to both arguments

Kata kerja monadik

(F G H) y == (F y) G (H y)
(G H) y == y G (H y)  NB. Note that this is different from APL
([: G H) y == G (H y)
(F G H I J K) y == (F (G H (I J K))) y
                == y F ((G y) H ((I y) J (K y)))
F@G y == F (G y)

Lain-lain

x&F y == x F y
F&y x == x F y
y F~ x == x F y
F~ y == y F y

Trik

(F x) G (H y)

Solusi diam-diam: (G~F)~H; tergantung pada kata kerja aktual, pertimbangkan menata ulang argumen kiri dan kanan untuk dihapus~ .

x ((G~F)~H) y
x (G~F)~ (H y)
(H y) (G~F) x
(H y) G~ (F x)
(F x) G (H y)

Penggantian Monadic-Dyadic

>:y == 1+y
<:y == 1-~y or _1+y
+:y == 2*y
-.y == 1-y
-:y == 2%~y
*:y == 2^~y
#.y == 2#.y
#.inv y == 2#.inv y  NB. #: doesn't work this way
{.y == 0{y
{:y == _1{y
}.y == 1}.y
+/y == 1#.y
Bubbler
sumber
1
(G~F)~Hadalah kebaikan bergelembung murni!
Jonah
2

& adalah temanmu, gunakan dengan bijak

vadalah kata kerja, nadalah kata benda, xdany argumen kiri dan kanan, masing-masing.

Monad &: Perkenalkan~ rantai kata keterangan / konjungsi di dalam

Kata keterangan / konjungsi mengevaluasi dari kiri. Jadi sesuatu seperti _2&+/\&.>tidak akan berfungsi karena diurai seperti yang (_2&+)/\&.>kita inginkan _2&(+/\)&.>. Dalam hal ini, menukar kiri / kanan +/\dapat menyimpan byte, seperti pada +/\~&_2&.>karena ini diuraikan sebagai ((+/\)~)&_2&.>. Untuk mengetahui mengapa ini berhasil:

+/\~&_2 y
is equivalent to
y +/\~ _2
is equivalent to
_2 +/\ y
is equivalent to
_2&(+/\) y

Angka dua &: Ulangi xkali

Apakah Anda tahu bahwa jika Anda memberikan argumen kiri xuntuk &, fungsi menerapkannya xkali untuky ? Cukup banyak tantangan meminta Anda untuk melakukan operasi tertentux waktu . Ini terutama dapat dicapai dengan dua cara:

  • Gunakan operator daya ^:tanpa operan yang benar

Jika operasi ini v, maka v^:menjadi kereta kata keterangan itu, ketika diberi operan kiri, menjadi kata kerja monadik. Begitu vditerapkan y, xkali.

x(v^:)y
is equivalent to
(v^:x)y
  • Gunakan diad &sebagai konjungsi terluar

Untuk menggunakan ini, Anda perlu mengidentifikasi nkata kerja konstan dan diad u, sehingga keduanyan u y atau y u nsetara dengan v. Maka Anda dapat menulis n&uatauu&n menyelesaikan seluruh tugas. Bentuk ini paling efektif ketika pilihan konstanta jelas, misalnya 3 in 3 u:(konversi karakter ke nilai ASCII).

Juga, u&nsedikit lebih disukai daripadan&u ketika struktur terluar uadalah konjungsi atau kata keterangan (dalam hal ini n&uharus n&(u); Anda dapat melakukanu~&n sebagai gantinya).

Perhatikan bahwa Anda dapat menempatkan diad &di mana saja di dalam kereta untuk mencapai fungsi arbitrer berulang ke argumen arbitrer, dalam arti yang sama dengan dinamis^: .

Bubbler
sumber