Bản đồ cho danh sách lồng nhau
Giả sử bạn đã có một danh sách lồng nhau, như một ma trận:
[[0 1 2][3 4 5][6 7 8]]
Hoặc một chuỗi các chuỗi:
["foo""bar"]
Và bạn muốn ánh xạ một khối lên cấp độ lồng nhau (nghĩa là áp dụng nó cho từng số hoặc từng ký tự). Giải pháp ngây thơ là một lồng nhau %
:
{{...}%}%
Tuy nhiên, bạn thực sự có thể đẩy khối bên trong lên ngăn xếp và sau đó sử dụng f%
. f
là "ánh xạ với tham số bổ sung", do đó, nó sẽ ánh xạ %
vào danh sách bên ngoài, sử dụng khối làm tham số thứ hai:
{...}f%
Lưu hai byte.
Một mẹo gọn gàng khác để làm một cái gì đó như for (i=0; i<5; ++i) for (j=0; j<5; ++j) {...}
là
5,_f{f{...}}
Bên ngoài f
sẽ ánh xạ vào phạm vi đầu tiên, cung cấp phạm vi thứ hai như một tham số bổ sung. Nhưng bây giờ, nếu bạn sử dụng f
lại, chỉ có phần tử ngăn xếp trên cùng là một mảng, do đó bạn f
ánh xạ khối bên trong vào đó, cung cấp "biến lặp" bên ngoài như một tham số bổ sung. Điều này có nghĩa là khối bên trong được chạy cùng i
và j
trên ngăn xếp.
Điều này có cùng số lượng ký tự như chỉ ánh xạ một khối lên sản phẩm của Cartesian (mặc dù cái sau sẽ ngắn hơn nếu bạn cần các cặp dưới dạng mảng):
5,_m*{~...}%
Sự khác biệt là phiên bản này mang lại một mảng kết quả cho tất cả các cặp, trong khi phiên bản kép f
mang lại một danh sách lồng nhau, có thể hữu ích nếu bạn muốn lưu trữ kết quả trong một lưới, với các biến lặp là tọa độ.
Cảm ơn Dennis đã chỉ cho tôi thủ thuật này.
Cập nhật 0.6.4
f
và :
hiện đã được cải thiện rất nhiều bằng cách sử dụng bất kỳ nhà khai thác nào khác bao gồm cả chính họ. Điều này có nghĩa là bạn có thể tiết kiệm nhiều byte hơn bây giờ. Ánh xạ một toán tử vào một danh sách lồng nhau thậm chí còn ngắn hơn:
{:x}%
{x}f%
::x
Điều này không thực sự giúp với việc ánh xạ các khối vào danh sách lồng nhau.
Đối với các khối hoặc toán tử áp dụng cho sản phẩm của Cartesian, điều này cũng đã rút ngắn hơn bây giờ, đối với các khối cũng như các toán tử:
5,_f{f{...}}
5,_ff{...}
5,_f{fx}
5,_ffx
Điều tuyệt vời là bây giờ bạn có thể lồng những thứ này. Vì vậy, bạn có thể áp dụng một toán tử dễ dàng cho cấp thứ ba trong danh sách:
:::x
Hoặc một khối với một số mánh khóe:
{...}ff%