Mapa de listas anidadas
Digamos que tienes una lista anidada, como una matriz:
[[0 1 2][3 4 5][6 7 8]]
O una serie de cadenas:
["foo""bar"]
Y desea asignar un bloque al nivel anidado (es decir, aplicarlo a cada número o cada carácter). La solución ingenua es anidada %:
{{...}%}%
Sin embargo, en realidad puede empujar el bloque interno sobre la pila y luego usarlo f%. fes "mapear con parámetro adicional", por lo que se mapeará %en la lista externa, usando el bloque como segundo parámetro:
{...}f%
Guarda dos bytes.
Otro buen truco para hacer algo como for (i=0; i<5; ++i) for (j=0; j<5; ++j) {...}es
5,_f{f{...}}
El exterior se fasignará al primer rango, proporcionando el segundo rango como un parámetro adicional. Pero ahora, si lo usa de fnuevo, solo el elemento de la pila superior es una matriz, por lo que fasigna el bloque interno a ese, proporcionando la "variable de iteración" externa como un parámetro adicional. Esto significa que el bloque interno se ejecuta con iy jen la pila.
Tiene la misma cantidad de caracteres que simplemente mapear un bloque en un producto cartesiano (aunque este último se acorta si necesita los pares como matrices):
5,_m*{~...}%
La diferencia es que esta versión produce una única matriz de resultados para todos los pares, mientras que el doble fproduce una lista anidada, que puede ser útil si desea almacenar los resultados en una cuadrícula, siendo las coordenadas las variables iteradoras.
Gracias a Dennis por mostrarme este truco.
0.6.4 Actualizar
fy :ahora han sido inmensamente mejorados al tomar cualquier otro operador, incluidos ellos mismos. Esto significa que ahora puede guardar aún más bytes. La asignación de un operador a una lista anidada se hizo aún más corta ahora:
{:x}%
{x}f%
::x
Sin embargo, esto realmente no ayuda con la asignación de bloques en listas anidadas.
En cuanto a la aplicación de bloques u operadores al producto cartesiano, esto también se acortó ahora, tanto para los bloques como para los operadores:
5,_f{f{...}}
5,_ff{...}
5,_f{fx}
5,_ffx
Lo bueno es que ahora puedes anidarlos. Por lo tanto, puede aplicar un operador con la misma facilidad al tercer nivel en una lista:
:::x
O un bloque con algunos trucos:
{...}ff%