Trucchi per affrontare /
e ⌿
in treno
Quando si utilizzano i treni, è possibile che si desideri utilizzare riduzioni f/
come la somma +/
o addirittura la riduzione della replica //
. Tuttavia, se il tuo treno ha più parti a sinistra della riduzione, avrai bisogno di parentesi per crearne una in cima. Ecco alcuni trucchi per salvare i byte.
Utilizzare 1∊
invece di monadici ∨/
o ∨⌿
su array booleani
Compito: date due stringhe di uguale lunghezza A e B, restituisce 2 se tutti i caratteri corrispondenti di A e B sono uguali, 0 altrimenti. Ad esempio A←'abc'
e B←'def'
dà 0
e A←'abc'
e B←'dec'
dà 2
.
Una soluzione dfn può essere A{2×∨/⍺=⍵}B
ma vuoi accorciarla andando tacito. A(2×∨/=)B
non funzionerà perché le regole della formazione del treno lo analizzano come 2 (× ∨/ =)
ma tu vuoi 2 × (∨/=)
.
Osserva che ∨/
o ∨⌿
su un vettore booleano ( ∨/,
o ∨⌿,
per array di rango superiore) chiede se è presente 1, cioè 1∊
, in modo da poter scrivere il nostro treno come 2×1∊=
.
Tieni presente che ∊
corrobora l'argomento corretto, quindi non puoi usarlo per ridurre ogni riga o colonna separatamente.
Usa 1⊥
invece di monadic +/
o+⌿
Compito: dato un elenco di elenchi L e un indice N, restituisce tre volte la somma dell'ennesimo elenco. Ad esempio L←(3 1 4)(2 7)
e N←1
dà 24
.
Una soluzione dfn può essere N{3×+/⍺⊃⍵}L
ma vuoi accorciarla andando tacito. N(3×+/⊃)L
non funzionerà perché le regole della formazione del treno lo analizzano come 3(× +/ ⊃)
ma tu vuoi 3 × (+/⊃)
.
Osservare che valutare un elenco di numeri in unario (base-1) equivale a sommare l'elenco perché ∑ { a , b , c , d } = a + b + c + d = ( a × 1³) + ( b × 1² ) + ( c × 1¹) + ( d × 1⁰). Pertanto +/a b c d
è lo stesso di 1⊥a b c d
e possiamo scrivere il nostro treno come 3×1⊥⊃
.
Si noti che su argomenti di rango superiore, 1⊥
è equivalente a +⌿
.
Utilizzare f.g
invece di f/g
argomenti scalari e / o vettoriali
Compito: dati un elenco L e un numero N, restituisce l'intervallo 1 completo del numero di resti minimi di divisione quando gli elementi di L sono divisi per NEg L←31 41 59
e N←7
dà 1 2 3
.
Una soluzione dfn può essere N{⍳⌊/⍺|⍵}L
ma vuoi accorciarla andando tacito. N(⍳⌊/|)L
non funzionerà perché le regole della formazione del treno lo analizzano come ⍳ (⌊/) |
ma tu vuoi ⍳ (⌊/|)
.
Il prodotto interno A f.g B
di due funzioni scalari quando gli argomenti sono scalari e / o vettori è lo stesso di f/ A g B
perché entrambi sono (A[1] g B[1]) f (A[2] g B[2]) f (A[3] g B[3])
ecc., Quindi possiamo scrivere il nostro treno come ⍳⌊.|
.
Si noti che questo non funziona per array di livello superiore.
Utilizzare ∊⊆
invece di /
con argomenti booleani left e simple vector right
Attività: dati un elenco L e un numero N, filtrare l'elenco in modo che rimangano solo numeri maggiori di N. Ad esempio L←3 1 4
e N←1
dà 3 4
.
Una soluzione dfn può essere N{(⍺<⍵)/⍵}L
ma vuoi accorciarla andando tacito. N(</⊢)L
non funzionerà perché le regole di associazione analizzeranno questo come, (</) ⊢
ma si desidera /
essere la funzione replicare anziché ridurre l'operatore .
Dyadic ⊆
con un argomento booleano a sinistra suddivide l'argomento a destra in base alle esecuzioni di 1s nell'argomento a sinistra, facendo cadere gli elementi indicati da 0s. Questo è quasi ciò che vogliamo, a parte il partizionamento indesiderato. Tuttavia, possiamo sbarazzarci del partizionamento applicando monadic ∊
. Così {(⍺<⍵)/⍵}
può diventare {∊(⍺<⍵)⊆⍵}
e così possiamo scrivere il nostro treno come ∊<⊆⊢
.
Si noti che questo non funziona per array di livello superiore.
Utilizzare al 0⊥
posto di ⊢/
o ⊢⌿
con argomenti numerici
Compito: dati un elenco L e un numero N, moltiplica N con l'elemento più a destra di LEg L←3 1 4
e N←2
dà 8
.
Una soluzione dfn può essere N{⍺×⊢/⍵}L
ma vuoi accorciarla andando tacito. N(⊣×⊢/⊢)L
non funzionerà perché le regole della formazione del treno lo analizzano come ⊣ (× ⊢/ ⊢)
ma tu vuoi ⊣ × (⊢/⊢)
.
Osservare che 0⊥
su un array numerico è uguale a ⊢⌿
, quindi possiamo scrivere il nostro treno come ⊣×0⊥⊢
.
Si noti che questo seleziona l'ultima cella principale di array di livello superiore.