Sztuczki do radzenia sobie z pociągami /
i ⌿
w pociągach
Przy korzystaniu z pociągów może chcesz użyć redukcji f/
takich jak sumy +/
, a nawet zmniejszenie replikacji //
. Jeśli jednak twój pociąg ma więcej części po lewej stronie redukcji, potrzebujesz nawiasów, aby utworzyć szczyt. Oto kilka sztuczek, aby zaoszczędzić bajty.
Użyj 1∊
zamiast tablic monadycznych ∨/
lub ∨⌿
na tablicach boolowskich
Zadanie: Biorąc pod uwagę dwa ciągi A i B o równej długości, zwróć 2, jeśli dowolne odpowiadające znaki A i B są równe, w przeciwnym razie 0. Np A←'abc'
i B←'def'
daje 0
a A←'abc'
i B←'dec'
daje 2
.
Rozwiązanie dfn może być, A{2×∨/⍺=⍵}B
ale chcesz je skrócić, przechodząc milczenie. A(2×∨/=)B
nie zadziała, ponieważ zasady formowania pociągów parsują to tak, jak 2 (× ∨/ =)
chcesz 2 × (∨/=)
.
Zauważ, że ∨/
lub ∨⌿
na wektorze boolowskim ( ∨/,
lub w ∨⌿,
przypadku tablic wyższej rangi) pyta, czy jest jakikolwiek 1, tzn. Czy 1∊
możemy napisać nasz pociąg jako 2×1∊=
.
Zwróć uwagę, że ∊
zachowuje właściwy argument, więc nie można go użyć do zmniejszenia każdego wiersza lub kolumny osobno.
Użyj 1⊥
zamiast monadycznego +/
lub+⌿
Zadanie: Biorąc pod uwagę listę list L i indeks N, zwróć trzykrotnie sumę N-tej listy. Np. L←(3 1 4)(2 7)
I N←1
daje 24
.
Rozwiązanie dfn może być, N{3×+/⍺⊃⍵}L
ale chcesz je skrócić, przechodząc milczenie. N(3×+/⊃)L
nie zadziała, ponieważ zasady formowania pociągów parsują to tak, jak 3(× +/ ⊃)
chcesz 3 × (+/⊃)
.
Zauważ, że ocena listy liczb w jednostkowej (podstawa-1) jest równoważna zsumowaniem listy, ponieważ ∑ { a , b , c , d } = a + b + c + d = ( a × 1³) + ( b × 1² ) + ( c × 1¹) + ( d × 1⁰). Dlatego +/a b c d
jest taki sam jak 1⊥a b c d
i możemy napisać nasz pociąg jako 3×1⊥⊃
.
Zauważ, że w argumentach wyższej rangi 1⊥
jest to równoważne z +⌿
.
Użyj f.g
zamiast f/g
z argumentami skalarnymi i / lub wektorowymi
Zadanie: Biorąc pod uwagę listę L i liczbę N, zwróć zakres 1 dokładnie liczbę resztek minimalnego podziału, gdy elementy L zostaną podzielone przez NEg L←31 41 59
i N←7
daje 1 2 3
.
Rozwiązanie dfn może być, N{⍳⌊/⍺|⍵}L
ale chcesz je skrócić, przechodząc milczenie. N(⍳⌊/|)L
nie zadziała, ponieważ zasady formowania pociągów parsują to tak, jak ⍳ (⌊/) |
chcesz ⍳ (⌊/|)
.
Wewnętrzny iloczyn A f.g B
dwóch funkcji skalarnych, gdy argumentami są skalary i / lub wektory, jest taki sam, f/ A g B
ponieważ oba są (A[1] g B[1]) f (A[2] g B[2]) f (A[3] g B[3])
itp., Więc możemy napisać nasz ciąg jako ⍳⌊.|
.
Zauważ, że to nie działa w przypadku tablic wyższego rzędu.
Użyj ∊⊆
zamiast /
z logicznymi argumentami lewej i prostej wektorowej prawej
Zadanie: biorąc pod uwagę listę L i liczbę N, przefiltruj listę, aby pozostały tylko liczby większe niż N. Np. L←3 1 4
I N←1
daje 3 4
.
Rozwiązanie dfn może być, N{(⍺<⍵)/⍵}L
ale chcesz je skrócić, przechodząc milczenie. N(</⊢)L
nie zadziała, ponieważ reguły wiązania to przeanalizują, ponieważ (</) ⊢
chcesz /
być replikacją funkcji, a nie operatorem zmniejszania .
Dyadic ⊆
z logicznym lewym argumentem dzieli prawy argument zgodnie z przebiegiem 1s w lewym argumencie, usuwając elementy wskazane przez 0s. To jest prawie to, czego chcemy, z wyjątkiem niechcianego partycjonowania. Możemy jednak pozbyć się partycjonowania, stosując monadic ∊
. W ten sposób {(⍺<⍵)/⍵}
możemy się stać {∊(⍺<⍵)⊆⍵}
i w ten sposób możemy napisać nasz pociąg jako ∊<⊆⊢
.
Zauważ, że to nie działa w przypadku tablic wyższego rzędu.
Użyj 0⊥
zamiast ⊢/
lub ⊢⌿
z argumentami numerycznymi
Zadanie: Biorąc pod uwagę listę L i liczbę N, pomnóż N przez najbardziej prawy element LEg L←3 1 4
i N←2
daje 8
.
Rozwiązanie dfn może być, N{⍺×⊢/⍵}L
ale chcesz je skrócić, przechodząc milczenie. N(⊣×⊢/⊢)L
nie zadziała, ponieważ zasady formowania pociągów parsują to tak, jak ⊣ (× ⊢/ ⊢)
chcesz ⊣ × (⊢/⊢)
.
Zauważ, że 0⊥
na tablicy liczbowej jest to samo ⊢⌿
, więc możemy napisać nasz pociąg jako ⊣×0⊥⊢
.
Zauważ, że wybiera to ostatnią główną komórkę tablic wyższego rzędu.