Trenlerle /ve ⌿trenlerle uğraşmak için püf noktaları
Ne zaman trenler kullanarak size indirim kullanmak isteyebilirsiniz f/toplamı gibi +/ve hatta çoğaltmak azaltılması //. Bununla birlikte, treninizin azaltma işleminin solunda daha fazla bölümü varsa, üstüne oluşturmak için parantez gerekir. İşte bayt kurtarmak için bazı püf noktaları.
1∊Monadik ∨/veya ∨⌿Boolean dizileri yerine kullanın
Görev: İki eşit uzunluktaki A ve B dizeleri göz önüne alındığında, A ve B'nin karşılık gelen karakterlerinin her ikisi de eşitse, 2 döndürün. Örneğin A←'abc've B←'def'verir 0ve A←'abc've B←'dec'verir 2.
Bir dfn çözümü olabilir, A{2×∨/⍺=⍵}Bancak zımni yaparak kısaltmak istiyorsunuz. A(2×∨/=)Bişe yaramayacak çünkü tren oluşum kuralları 2 (× ∨/ =)bunu istediğiniz gibi ayrıştırıyor 2 × (∨/=).
Bunu ∨/veya ∨⌿bir Boolean vektöründe ( ∨/,veya ∨⌿,daha yüksek dereceli diziler için) var olup olmadığını sorar, yani 1∊treni şu şekilde yazabiliriz 2×1∊=.
∊Bunun doğru argümanını ortaya çıkardığına dikkat edin, böylece her bir satırı veya sütunu ayrı ayrı azaltmak için kullanamazsınız.
Kullanım 1⊥yerine monadic ait +/veya+⌿
Görev: L listelerinin ve N dizininin bir listesi göz önüne alındığında, Nci listenin toplamını üç kere döndürün. Örn L←(3 1 4)(2 7)ve N←1verir 24.
Bir dfn çözümü olabilir, N{3×+/⍺⊃⍵}Lancak zımni yaparak kısaltmak istiyorsunuz. N(3×+/⊃)Lişe yaramayacak çünkü tren oluşum kuralları 3(× +/ ⊃)bunu istediğiniz gibi ayrıştırıyor 3 × (+/⊃).
Unary (sayı-1) 'deki bir sayı listesinin değerlendirilmesinin listenin toplanmasına eşdeğer olduğunu gözlemleyin, çünkü because { a , b , c , d } = a + b + c + d = ( a × 1³) + ( b × 1² ) + ( c × 1¹) + ( d × 1⁰). Bu nedenle +/a b c d, aynı 1⊥a b c dve treni de aynı şekilde yazabiliriz 3×1⊥⊃.
Yüksek rütbeli argümanlarda, 1⊥bunun eşdeğeri olduğuna dikkat edin +⌿.
Skaler ve / veya vektör argümanları f.gyerine kullanınf/g
Görev: L ve N sayısının bir listesi verildiğinde, L'nin elemanları NEg'ye bölündüğünde L←31 41 59ve N←7verdiğinde , 1. aralığı, minimum bölme kalanı sayısının sonuna kadar döndürün 1 2 3.
Bir dfn çözümü olabilir, N{⍳⌊/⍺|⍵}Lancak zımni yaparak kısaltmak istiyorsunuz. N(⍳⌊/|)Lişe yaramayacak çünkü tren oluşum kuralları ⍳ (⌊/) |bunu istediğiniz gibi ayrıştırıyor ⍳ (⌊/|).
A f.g BSkaler iki iç çarpımı , argümanlar skaler ve / veya vektörler olduğu zaman aynıdır, f/ A g Bikisi de (A[1] g B[1]) f (A[2] g B[2]) f (A[3] g B[3])vb. İle aynıdır , bu yüzden treni şu şekilde yazabiliriz ⍳⌊.|.
Bunun yüksek dereceli diziler için çalışmadığını unutmayın.
Boolean left ve simple vector right argümanları ∊⊆yerine kullanın/
Görev: Bir L listesi ve bir N numarası verildiğinde, yalnızca N'den büyük sayıların kalması için listeyi filtreleyin. Örn L←3 1 4ve N←1verir 3 4.
Bir dfn çözümü olabilir, N{(⍺<⍵)/⍵}Lancak bunu yapıp kısalmak istersiniz. N(</⊢)LBağlayıcı kurallar bunu ayrıştıracağı için çalışmayacak, (</) ⊢ancak operatörün azaltmasından ziyade /işlev kopyası olmak istiyorsunuz .
Diyadik ⊆bir BooleANDile sol argüman 1s ishal göre argüman bölümler sağ argüman sol bırakarak elemanları 0s ile gösterilir. Neredeyse istediğimiz bu, istenmeyen bölümlere ayırmak. Ancak, monadik uygulayarak bölümlemeden kurtulabiliriz ∊. Böylece {(⍺<⍵)/⍵}olabilir {∊(⍺<⍵)⊆⍵}ve böylece trenimizi olarak yazabiliriz ∊<⊆⊢.
Bunun yüksek dereceli diziler için çalışmadığını unutmayın.
0⊥Bunun yerine ⊢/veya ⊢⌿sayısal değişkenlerle kullanın
Görev: ayağın en sağdaki eleman içeren bir liste L ve bir numara N, çarpma N Verilen L←3 1 4ve N←2verir 8.
Bir dfn çözümü olabilir, N{⍺×⊢/⍵}Lancak zımni yaparak kısaltmak istiyorsunuz. N(⊣×⊢/⊢)Lişe yaramayacak çünkü tren oluşum kuralları ⊣ (× ⊢/ ⊢)bunu istediğiniz gibi ayrıştırıyor ⊣ × (⊢/⊢).
0⊥Sayısal bir dizideki ile aynı olduğuna dikkat edin ⊢⌿, böylece trenimizi şu şekilde yazabiliriz ⊣×0⊥⊢.
Bunun, yüksek dereceli dizilerin son ana hücresini seçtiğini unutmayın.