Trucos para tratar /
y ⌿
en trenes
Al usar trenes, es posible que desee usar reducciones f/
como la suma +/
o incluso replicar la reducción //
. Sin embargo, si su tren tiene más partes a la izquierda de la reducción, necesita paréntesis para crear una cima. Aquí hay algunos trucos para guardar bytes.
Usar en 1∊
lugar de matrices monádicas ∨/
o ∨⌿
booleanas
Tarea: Dadas dos cadenas de igual longitud A y B, devuelve 2 si alguno de los caracteres correspondientes de A y B son iguales, 0 de lo contrario. Por ejemplo, A←'abc'
y B←'def'
da 0
y A←'abc'
y B←'dec'
da 2
.
Puede ser una solución dfn A{2×∨/⍺=⍵}B
pero desea acortarla tácitamente. A(2×∨/=)B
no va a funcionar porque las reglas de formación de trenes analizan esto como 2 (× ∨/ =)
quieres 2 × (∨/=)
.
Observe que ∨/
o ∨⌿
en un vector booleano ( ∨/,
o ∨⌿,
para matrices de rango superior) pregunta si hay 1 presente, es decir 1∊
, para que podamos escribir nuestro tren como 2×1∊=
.
Tenga en cuenta que ∊
descifra su argumento correcto, por lo que no puede usarlo para reducir cada fila o columna por separado.
Usar en 1⊥
lugar de monádico +/
o+⌿
Tarea: Dada una lista de listas L y un índice N, devuelve tres veces la suma de la enésima lista. Por ejemplo L←(3 1 4)(2 7)
y N←1
da 24
.
Puede ser una solución dfn N{3×+/⍺⊃⍵}L
pero desea acortarla tácitamente. N(3×+/⊃)L
no va a funcionar porque las reglas de formación de trenes analizan esto como 3(× +/ ⊃)
quieres 3 × (+/⊃)
.
Observe que evaluar una lista de números en unario (base-1) es equivalente a sumar la lista porque ∑ { a , b , c , d } = a + b + c + d = ( a × 1³) + ( b × 1² ) + ( c × 1¹) + ( d × 1⁰). Por +/a b c d
lo tanto, es lo mismo que 1⊥a b c d
, y podemos escribir nuestro tren como 3×1⊥⊃
.
Tenga en cuenta que en argumentos de rango superior, 1⊥
es equivalente a +⌿
.
Usar en f.g
lugar de f/g
con argumentos escalares y / o vectoriales
Tarea: Dada una lista L y un número N, devuelve el rango 1 a través del número de división mínima restante cuando los elementos de L se dividen por NEg L←31 41 59
y N←7
da 1 2 3
.
Puede ser una solución dfn N{⍳⌊/⍺|⍵}L
pero desea acortarla tácitamente. N(⍳⌊/|)L
no va a funcionar porque las reglas de formación de trenes analizan esto como ⍳ (⌊/) |
quieres ⍳ (⌊/|)
.
El producto interno A f.g B
de dos funciones escalares cuando los argumentos son escalares y / o vectores es el mismo que f/ A g B
porque ambos son (A[1] g B[1]) f (A[2] g B[2]) f (A[3] g B[3])
etc., por lo que podemos escribir nuestro tren como ⍳⌊.|
.
Tenga en cuenta que esto no funciona para matrices de rango superior.
Use en ∊⊆
lugar de /
con argumentos booleanos izquierdo y simple vector derecho
Tarea: Dada una lista L y un número N, filtre la lista para que solo queden números mayores que N. Por ejemplo L←3 1 4
y N←1
da 3 4
.
Puede ser una solución dfn N{(⍺<⍵)/⍵}L
pero desea acortarla tácitamente. N(</⊢)L
no funcionará porque las reglas de enlace analizarán esto como (</) ⊢
pero desea /
que la función se replique en lugar de que el operador reduzca .
Dyadic ⊆
con un argumento izquierdo booleano divide el argumento derecho de acuerdo con corridas de 1s en el argumento izquierdo, dejando caer elementos indicados por 0s. Esto es casi lo que queremos, salvo la partición no deseada. Sin embargo, podemos deshacernos de la partición aplicando monadic ∊
. Así {(⍺<⍵)/⍵}
puede convertirse {∊(⍺<⍵)⊆⍵}
y así podemos escribir nuestro tren como ∊<⊆⊢
.
Tenga en cuenta que esto no funciona para matrices de rango superior.
Usar en 0⊥
lugar de ⊢/
o ⊢⌿
con argumentos numéricos
Tarea: Dada una lista L y un número N, multiplique el N con el elemento más a la derecha de LEg L←3 1 4
y N←2
da 8
.
Puede ser una solución dfn N{⍺×⊢/⍵}L
pero desea acortarla tácitamente. N(⊣×⊢/⊢)L
no va a funcionar porque las reglas de formación de trenes analizan esto como ⊣ (× ⊢/ ⊢)
quieres ⊣ × (⊢/⊢)
.
Observe que 0⊥
en una matriz numérica es lo mismo que ⊢⌿
, por lo que podemos escribir nuestro tren como ⊣×0⊥⊢
.
Tenga en cuenta que esto selecciona la última celda principal de las matrices de rango superior.