Truques para lidar com /
e ⌿
em trens
Ao usar trens, convém usar reduções f/
como soma +/
ou mesmo replicar a redução //
. No entanto, se o seu trem tiver mais peças à esquerda da redução, você precisará de parênteses para criar um topo. Aqui estão alguns truques para salvar bytes.
Use em 1∊
vez de matrizes monádicas ∨/
ou ∨⌿
booleanas
Tarefa: Dadas duas seqüências de tamanho igual A e B, retorne 2 se qualquer caractere correspondente de A e B for igual, 0 caso contrário. Por exemplo, A←'abc'
e B←'def'
dá 0
e A←'abc'
e B←'dec'
dá 2
.
Uma solução dfn pode ser, A{2×∨/⍺=⍵}B
mas você deseja reduzi-la, tornando-a tácita. A(2×∨/=)B
não vai funcionar porque as regras de formação de trens analisam isso como 2 (× ∨/ =)
você deseja 2 × (∨/=)
.
Observe que ∨/
ou ∨⌿
em um vetor booleano ( ∨/,
ou ∨⌿,
para matrizes de classificação mais alta) pergunta se existe algum 1 presente, ou seja 1∊
, para que possamos escrever nosso trem como 2×1∊=
.
Observe que ∊
o argumento correto é desviado, portanto você não pode usá-lo para reduzir cada linha ou coluna separadamente.
Use em 1⊥
vez de monádico +/
ou+⌿
Tarefa: Dada uma lista de listas L e um índice N, retorne três vezes a soma da enésima lista. Por exemplo, L←(3 1 4)(2 7)
e N←1
dá 24
.
Uma solução dfn pode ser, N{3×+/⍺⊃⍵}L
mas você deseja reduzi-la, tornando-a tácita. N(3×+/⊃)L
não vai funcionar porque as regras de formação de trens analisam isso como 3(× +/ ⊃)
você deseja 3 × (+/⊃)
.
Observe que avaliar uma lista de números em unário (base 1) é equivalente a somar a lista porque a { a , b , c , d } = a + b + c + d = ( a × 1³) + ( b × 1²) ) + ( c × 1¹) + ( d × 1⁰). Portanto, +/a b c d
é o mesmo que 1⊥a b c d
, e podemos escrever nosso trem como 3×1⊥⊃
.
Observe que, nos argumentos de classificação mais alta, 1⊥
é equivalente a +⌿
.
Use em f.g
vez de f/g
argumentos escalares e / ou vetoriais
Tarefa: Dada uma lista L e um número N, retornar o intervalo 1 completa o número de resto mínimos divisão quando os elementos de L são divididos por ELg L←31 41 59
e N←7
dá 1 2 3
.
Uma solução dfn pode ser, N{⍳⌊/⍺|⍵}L
mas você deseja reduzi-la, tornando-a tácita. N(⍳⌊/|)L
não vai funcionar porque as regras de formação de trens analisam isso como ⍳ (⌊/) |
você deseja ⍳ (⌊/|)
.
O produto interno A f.g B
das duas funções escalares quando os argumentos são escalares e / ou vetores é o mesmo que f/ A g B
ambos são (A[1] g B[1]) f (A[2] g B[2]) f (A[3] g B[3])
etc., para que possamos escrever nosso trem como ⍳⌊.|
.
Observe que isso não funciona para matrizes de classificação mais alta.
Use em ∊⊆
vez de /
argumentos à esquerda booleanos e à direita de vetor simples
Tarefa: Dada uma lista L e um número N, filtre a lista para que apenas números maiores que N permaneçam. Por exemplo, L←3 1 4
e N←1
dá 3 4
.
Uma solução dfn pode ser, N{(⍺<⍵)/⍵}L
mas você deseja reduzi-la, tornando-a tácita. N(</⊢)L
não funcionará porque as regras de ligação analisarão isso como (</) ⊢
mas você deseja /
que a função seja replicada em vez de reduzir o operador .
Diádico ⊆
com um argumento à esquerda booleano particiona o argumento à direita de acordo com execuções de 1s no argumento à esquerda, eliminando elementos indicados por 0s. Isso é quase o que queremos, exceto pelo particionamento indesejado. No entanto, podemos nos livrar da partição aplicando monádica ∊
. Assim {(⍺<⍵)/⍵}
pode se tornar {∊(⍺<⍵)⊆⍵}
e assim podemos escrever nosso trem como ∊<⊆⊢
.
Observe que isso não funciona para matrizes de classificação mais alta.
Use em 0⊥
vez de ⊢/
ou ⊢⌿
com argumentos numéricos
Tarefa: Dada uma lista L e um número N, multiplique N pelo elemento mais à direita de LEg L←3 1 4
e N←2
dê 8
.
Uma solução dfn pode ser, N{⍺×⊢/⍵}L
mas você deseja reduzi-la, tornando-a tácita. N(⊣×⊢/⊢)L
não vai funcionar porque as regras de formação de trens analisam isso como ⊣ (× ⊢/ ⊢)
você deseja ⊣ × (⊢/⊢)
.
Observe que 0⊥
em uma matriz numérica é o mesmo que ⊢⌿
, para que possamos escrever nosso trem como ⊣×0⊥⊢
.
Observe que isso seleciona a última célula principal de matrizes de classificação mais alta.