Tricks für den Umgang mit /
und ⌿
in Zügen
Wenn Sie Züge benutzen, möchten Sie vielleicht Reduzierungen f/
wie Summe +/
oder sogar Nachbildung verwenden //
. Wenn Ihr Zug jedoch links von der Verkleinerung mehr Teile enthält, benötigen Sie Klammern, um eine Spitze zu erstellen. Hier sind einige Tricks zum Speichern von Bytes.
Verwenden Sie diese 1∊
Option anstelle von monadischen ∨/
oder ∨⌿
booleschen Arrays
Aufgabe: Geben Sie bei zwei gleichlangen Zeichenfolgen A und B 2 zurück, wenn die entsprechenden Zeichen von A und B gleich sind, andernfalls 0. ZB A←'abc'
und B←'def'
gibt 0
und A←'abc'
und B←'dec'
gibt 2
.
Eine DFN-Lösung kann sein, A{2×∨/⍺=⍵}B
aber Sie möchten sie durch Stillschweigen verkürzen. A(2×∨/=)B
wird nicht funktionieren, weil die Regeln der Zugbildung dies so parsen, wie 2 (× ∨/ =)
Sie es möchten 2 × (∨/=)
.
Beobachten Sie, dass ∨/
oder ∨⌿
auf einem Booleschen Vektor ( ∨/,
oder ∨⌿,
für Arrays mit höherem Rang) gefragt wird, ob 1 vorhanden ist, dh 1∊
, wir können unseren Zug schreiben als 2×1∊=
.
Beachten Sie, dass ∊
das richtige Argument verwendet wird, sodass Sie nicht jede Zeile oder Spalte einzeln reduzieren können.
Verwenden Sie 1⊥
anstelle von monadisch +/
oder+⌿
Aufgabe: Geben Sie bei einer Liste von Listen L und einem Index N die Summe der N-ten Liste dreimal zurück. ZB L←(3 1 4)(2 7)
und N←1
gibt 24
.
Eine DFN-Lösung kann sein, N{3×+/⍺⊃⍵}L
aber Sie möchten sie durch Stillschweigen verkürzen. N(3×+/⊃)L
wird nicht funktionieren, weil die Regeln der Zugbildung dies so parsen, wie 3(× +/ ⊃)
Sie es möchten 3 × (+/⊃)
.
Beachten Sie, dass das Auswerten einer Liste von Zahlen in Unary (Basis-1) gleichbedeutend ist mit dem Summieren der Liste, da because { a , b , c , d } = a + b + c + d = ( a × 1³) + ( b × 1²) ) + ( c × 1¹) + ( d × 1⁰). Deshalb +/a b c d
ist das genauso 1⊥a b c d
, und wir können unseren Zug so schreiben 3×1⊥⊃
.
Beachten Sie, dass bei übergeordneten Argumenten 1⊥
gleichbedeutend mit ist +⌿
.
Verwenden Sie f.g
statt f/g
mit Skalar- und / oder Vektorargumenten
Aufgabe: Geben Sie für eine Liste L und eine Zahl N den Bereich 1 durch die Anzahl der verbleibenden minimalen Divisionen zurück, wenn die Elemente von L durch NEg dividiert sind L←31 41 59
und N←7
ergeben 1 2 3
.
Eine DFN-Lösung kann sein, N{⍳⌊/⍺|⍵}L
aber Sie möchten sie durch Stillschweigen verkürzen. N(⍳⌊/|)L
wird nicht funktionieren, weil die Regeln der Zugbildung dies so parsen, wie ⍳ (⌊/) |
Sie es möchten ⍳ (⌊/|)
.
Das innere Produkt A f.g B
von skalaren zwei Funktionen, wenn die Argumente Skalare und / oder Vektoren sind, ist dasselbe wie, f/ A g B
weil beide (A[1] g B[1]) f (A[2] g B[2]) f (A[3] g B[3])
usw. sind, so dass wir unseren Zug schreiben können als ⍳⌊.|
.
Beachten Sie, dass dies für höherrangige Arrays nicht funktioniert.
Verwenden Sie ∊⊆
anstelle von /
booleschen linken und einfachen Vektor-rechten Argumenten
Aufgabe: Filtern Sie die Liste mit einer Liste L und einer Zahl N so, dass nur Zahlen größer als N übrig bleiben. ZB L←3 1 4
und N←1
gibt 3 4
.
Eine DFN-Lösung kann sein, N{(⍺<⍵)/⍵}L
aber Sie möchten sie durch Stillschweigen verkürzen. N(</⊢)L
wird nicht funktionieren, da die Bindungsregeln dies analysieren, (</) ⊢
aber Sie möchten /
die Funktion replizieren und nicht den Operator reduzieren .
Dyadisch ⊆
mit einem booleschen linken Argument unterteilt das rechte Argument in Einsenreihen im linken Argument und löscht Elemente, die durch 0en gekennzeichnet sind. Dies ist fast das, was wir wollen, abgesehen von der unerwünschten Partitionierung. Wir können jedoch die Partitionierung durch Anwenden von monadic aufheben ∊
. So {(⍺<⍵)/⍵}
können {∊(⍺<⍵)⊆⍵}
wir werden und so können wir unseren Zug schreiben ∊<⊆⊢
.
Beachten Sie, dass dies für höherrangige Arrays nicht funktioniert.
Verwenden Sie 0⊥
anstelle von ⊢/
oder ⊢⌿
mit numerischen Argumenten
Aufgabe: Multiplizieren Sie das N mit dem am weitesten rechts stehenden Element von LEg L←3 1 4
und N←2
geben Sie eine Liste L und eine Zahl N an 8
.
Eine DFN-Lösung kann sein, N{⍺×⊢/⍵}L
aber Sie möchten sie durch Stillschweigen verkürzen. N(⊣×⊢/⊢)L
wird nicht funktionieren, weil die Regeln der Zugbildung dies so parsen, wie ⊣ (× ⊢/ ⊢)
Sie es möchten ⊣ × (⊢/⊢)
.
Beachten Sie, dass 0⊥
in einem numerischen Array dasselbe wie in einem numerischen Array ist ⊢⌿
, sodass wir unseren Zug als schreiben können ⊣×0⊥⊢
.
Beachten Sie, dass hiermit die letzte Hauptzelle höherrangiger Arrays ausgewählt wird.