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à 0e A←'abc'e B←'dec'dà 2.
Una soluzione dfn può essere A{2×∨/⍺=⍵}Bma vuoi accorciarla andando tacito. A(2×∨/=)Bnon 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←1dà 24.
Una soluzione dfn può essere N{3×+/⍺⊃⍵}Lma vuoi accorciarla andando tacito. N(3×+/⊃)Lnon 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 de possiamo scrivere il nostro treno come 3×1⊥⊃.
Si noti che su argomenti di rango superiore, 1⊥è equivalente a +⌿.
Utilizzare f.ginvece di f/gargomenti 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 59e N←7dà 1 2 3.
Una soluzione dfn può essere N{⍳⌊/⍺|⍵}Lma vuoi accorciarla andando tacito. N(⍳⌊/|)Lnon funzionerà perché le regole della formazione del treno lo analizzano come ⍳ (⌊/) |ma tu vuoi ⍳ (⌊/|).
Il prodotto interno A f.g Bdi due funzioni scalari quando gli argomenti sono scalari e / o vettori è lo stesso di f/ A g Bperché 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 4e N←1dà 3 4.
Una soluzione dfn può essere N{(⍺<⍵)/⍵}Lma vuoi accorciarla andando tacito. N(</⊢)Lnon 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 4e N←2dà 8.
Una soluzione dfn può essere N{⍺×⊢/⍵}Lma vuoi accorciarla andando tacito. N(⊣×⊢/⊢)Lnon 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.