Карта для вкладених списків
Скажіть, у вас вкладений список, як матриця:
[[0 1 2][3 4 5][6 7 8]]
Або масив рядків:
["foo""bar"]
І ви хочете зіставити блок на вкладений рівень (тобто застосувати його до кожного числа чи кожного символу). Наївне рішення - це вкладене %
:
{{...}%}%
Однак ви можете фактично натиснути внутрішній блок на стек і потім використовувати f%
. f
є "карта з додатковим параметром", тому вона буде відображатися %
у зовнішньому списку, використовуючи блок як другий параметр:
{...}f%
Зберігає два байти.
Ще один акуратний трюк зробити щось подібне for (i=0; i<5; ++i) for (j=0; j<5; ++j) {...}
- це
5,_f{f{...}}
Зовнішній f
буде відображатися на перший діапазон, подаючи другий діапазон як додатковий параметр. Але тепер, якщо ви f
знову використовуєте , лише верхній елемент стека є масивом, тому ви f
відображаєте внутрішній блок на нього, подаючи зовнішню "змінну ітерації" як додатковий параметр. Це означає, що внутрішній блок працює з i
і j
на стеку.
Це має таку ж кількість символів, що й просто відображення блоку на декартовому продукті (хоча останній стає коротшим, якщо вам потрібні пари як масиви):
5,_m*{~...}%
Різниця полягає в тому, що ця версія дає єдиний масив результатів для всіх пар, тоді як подвійний f
дає вкладений список, який може бути корисним, якщо ви хочете зберігати результати в сітці, при цьому змінні ітератора є координатами.
Дякую Деннісу, що показав мені цю хитрість.
0.6.4 Оновлення
f
і :
тепер вони були надзвичайно покращені, взявши будь-якого іншого оператора, включаючи себе. Це означає, що зараз ви можете зберегти ще більше байтів. Зображення оператора до вкладеного списку стало ще коротшим:
{:x}%
{x}f%
::x
Це насправді не допомагає зі складанням блоків на вкладені списки.
Що стосується застосувань блоків або операторів до декартового продукту, це також скоротилося і для блоків, і для операторів:
5,_f{f{...}}
5,_ff{...}
5,_f{fx}
5,_ffx
Приємно те, що тепер ви можете їх гніздо. Таким чином, ви можете так само легко застосувати оператора до третього рівня внизу списку:
:::x
Або блок з деякою хитрістю:
{...}ff%