Karte für verschachtelte Listen
Angenommen, Sie haben eine verschachtelte Liste wie eine Matrix:
[[0 1 2][3 4 5][6 7 8]]
Oder eine Reihe von Zeichenfolgen:
["foo""bar"]
Und Sie möchten einen Block auf die verschachtelte Ebene abbilden (dh auf jede Zahl oder jedes Zeichen anwenden). Die naive Lösung ist verschachtelt %
:
{{...}%}%
Sie können jedoch den inneren Block tatsächlich auf den Stapel schieben und dann verwenden f%
. f
Ist "map with additional parameter", so wird es %
auf die äußere Liste abgebildet, wobei der Block als zweiter Parameter verwendet wird:
{...}f%
Spart zwei Bytes.
Ein weiterer guter Trick for (i=0; i<5; ++i) for (j=0; j<5; ++j) {...}
ist
5,_f{f{...}}
Das äußere f
wird auf den ersten Bereich abgebildet und liefert den zweiten Bereich als zusätzlichen Parameter. Aber jetzt, wenn Sie es f
erneut verwenden, ist nur das oberste Stapelelement ein Array. Sie f
ordnen den inneren Block diesem zu und geben die äußere "Iterationsvariable" als zusätzlichen Parameter an. Dies bedeutet, dass der innere Block mit i
und läuftj
auf dem Stapel ausgeführt wird.
Dies hat die gleiche Anzahl von Zeichen wie nur das Abbilden eines Blocks auf ein kartesisches Produkt (obwohl das letztere kürzer wird, wenn Sie die Paare als Arrays benötigen):
5,_m*{~...}%
Der Unterschied besteht darin, dass diese Version eine einzige Reihe von Ergebnissen für alle Paare liefert, während die doppeltef
liefert eine verschachtelte Liste liefert, die nützlich sein kann, wenn Sie die Ergebnisse in einem Raster speichern möchten, wobei die Iteratorvariablen die Koordinaten sind.
Vielen Dank an Dennis, der mir diesen Trick gezeigt hat.
0.6.4 Update
f
und :
sind jetzt immens verbessert worden, indem jeder andere Operator, einschließlich sich selbst, übernommen wurde. So können Sie jetzt noch mehr Bytes einsparen. Das Zuordnen eines Operators zu einer verschachtelten Liste wurde jetzt noch kürzer:
{:x}%
{x}f%
::x
Dies hilft jedoch nicht wirklich beim Zuordnen von Blöcken zu verschachtelten Listen.
Das Anwenden von Blöcken oder Operatoren auf das kartesische Produkt wurde jetzt auch kürzer, sowohl für Blöcke als auch für Operatoren:
5,_f{f{...}}
5,_ff{...}
5,_f{fx}
5,_ffx
Schön ist, dass Sie diese nun verschachteln können. So können Sie einen Operator genauso einfach auf die dritte Ebene einer Liste anwenden:
:::x
Oder ein Block mit einigen Tricks:
{...}ff%