Peta untuk Daftar Bersarang
Katakanlah Anda punya daftar bersarang, seperti sebuah matriks:
[[0 1 2][3 4 5][6 7 8]]
Atau serangkaian string:
["foo""bar"]
Dan Anda ingin memetakan blok ke tingkat bersarang (yaitu menerapkannya ke setiap nomor atau setiap karakter). Solusi naif adalah bersarang %
:
{{...}%}%
Namun, Anda dapat benar-benar mendorong blok bagian dalam ke tumpukan dan kemudian menggunakannya f%
. f
adalah "map dengan parameter tambahan", sehingga akan memetakan %
ke daftar luar, menggunakan blok sebagai parameter kedua:
{...}f%
Menghemat dua byte.
Trik lain yang rapi untuk melakukan sesuatu for (i=0; i<5; ++i) for (j=0; j<5; ++j) {...}
adalah
5,_f{f{...}}
Bagian luar f
akan memetakan ke rentang pertama, memasok rentang kedua sebagai parameter tambahan. Tapi sekarang, jika Anda menggunakan f
lagi, hanya elemen stack atas adalah array, jadi Anda f
memetakan blok bagian dalam itu, memasok "variabel iterasi" luar sebagai parameter tambahan. Ini berarti blok dalam berjalan dengan i
dan j
pada tumpukan.
Ini memiliki jumlah karakter yang sama dengan hanya memetakan blok ke produk Cartesian (meskipun yang terakhir semakin pendek jika Anda membutuhkan pasangan sebagai array):
5,_m*{~...}%
Perbedaannya adalah bahwa versi ini menghasilkan satu array hasil untuk semua pasangan, sedangkan double- f
menghasilkan daftar bersarang, yang dapat berguna jika Anda ingin menyimpan hasil dalam kotak, dengan variabel iterator menjadi koordinat.
Terima kasih kepada Dennis karena menunjukkan trik ini kepada saya.
0.6.4 Pembaruan
f
dan :
sekarang telah sangat ditingkatkan dengan mengambil operator lain termasuk mereka sendiri. Ini berarti Anda dapat menyimpan lebih banyak byte sekarang. Memetakan operator ke daftar bersarang menjadi lebih pendek sekarang:
{:x}%
{x}f%
::x
Ini tidak terlalu membantu dengan memetakan blok ke daftar bersarang.
Adapun blok atau operator yang menerapkan produk Cartesian, ini juga menjadi lebih pendek sekarang, untuk blok serta operator:
5,_f{f{...}}
5,_ff{...}
5,_f{fx}
5,_ffx
Apa yang baik adalah bahwa Anda sekarang dapat bersarang ini. Jadi, Anda dapat menerapkan operator dengan mudah ke tingkat bawah daftar:
:::x
Atau satu blok dengan beberapa tipu daya:
{...}ff%