Mapa list zagnieżdżonych
Załóżmy, że masz zagnieżdżoną listę, na przykład macierz:
[[0 1 2][3 4 5][6 7 8]]
Lub tablica ciągów:
["foo""bar"]
I chcesz zmapować blok na poziom zagnieżdżony (tj. Zastosować go do każdej liczby lub każdego znaku). Naiwnym rozwiązaniem jest zagnieżdżenie %
:
{{...}%}%
Możesz jednak wcisnąć blok wewnętrzny na stos, a następnie użyć f%
. f
jest „mapuj z dodatkowym parametrem”, więc będzie %
mapowany na listę zewnętrzną, używając bloku jako drugiego parametru:
{...}f%
Zapisuje dwa bajty.
Kolejną zgrabną sztuczką, aby zrobić coś takiego for (i=0; i<5; ++i) for (j=0; j<5; ++j) {...}
jest
5,_f{f{...}}
Zewnętrzne f
mapuje na pierwszy zakres, podając drugi zakres jako dodatkowy parametr. Ale teraz, jeśli użyjesz go f
ponownie, tylko górny element stosu jest tablicą, więc f
odwzorowujesz na nim blok wewnętrzny, podając zewnętrzną „zmienną iteracyjną” jako dodatkowy parametr. Oznacza to, że wewnętrzny blok jest uruchamiana z i
i j
na stos.
Ma taką samą liczbę znaków, jak zwykłe mapowanie bloku na iloczyn kartezjański (chociaż ten drugi staje się krótszy, jeśli potrzebujesz par jako tablic):
5,_m*{~...}%
Różnica polega na tym, że ta wersja daje jedną tablicę wyników dla wszystkich par, podczas gdy podwójna f
daje zagnieżdżoną listę, co może być przydatne, jeśli chcesz zapisać wyniki w siatce, przy czym zmienne iteratora są współrzędnymi.
Dzięki Dennisowi za pokazanie mi tej sztuczki.
0.6.4 Aktualizacja
f
i :
zostały teraz znacznie ulepszone poprzez włączenie dowolnego innego operatora, w tym siebie. Oznacza to, że możesz teraz zaoszczędzić jeszcze więcej bajtów. Mapowanie operatora na zagnieżdżonej liście jest teraz jeszcze krótsze:
{:x}%
{x}f%
::x
Nie pomaga to jednak w mapowaniu bloków na listy zagnieżdżone.
Jeśli chodzi o stosowanie bloków lub operatorów do produktu kartezjańskiego, teraz również stało się to krótsze, zarówno dla bloków, jak i operatorów:
5,_f{f{...}}
5,_ff{...}
5,_f{fx}
5,_ffx
Fajne jest to, że możesz je teraz zagnieżdżać. Możesz więc równie łatwo zastosować operatora do trzeciego poziomu w dół listy:
:::x
Lub blok z pewnymi sztuczkami:
{...}ff%