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%
. f
es "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 f
asignará al primer rango, proporcionando el segundo rango como un parámetro adicional. Pero ahora, si lo usa de f
nuevo, solo el elemento de la pila superior es una matriz, por lo que f
asigna 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 i
y j
en 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 f
produce 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
f
y :
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%