Трюки для работы с поездами /и ⌿в поездах
При использовании поездов вы можете использовать сокращения, f/такие как сумма +/или даже дублирование сокращения //. Однако, если ваш поезд имеет больше частей слева от сокращения, вам нужно заключить в скобки верхнюю часть. Вот несколько приемов для сохранения байтов.
Используйте 1∊вместо монадических ∨/или ∨⌿логических массивов
Задача: Если заданы две строки A и B одинаковой длины, вернуть 2, если любые соответствующие символы A и B равны, иначе 0. Например , A←'abc'и B←'def'дает 0и A←'abc'и B←'dec'дает 2.
Решение dfn может быть, A{2×∨/⍺=⍵}Bно вы хотите сократить его, перейдя в молчание. A(2×∨/=)Bне собирается работать, потому что правила формирования поезда разбирают это так, как 2 (× ∨/ =)вы хотите 2 × (∨/=).
Заметим, что ∨/или ∨⌿на булевом векторе ( ∨/,или ∨⌿,для массивов более высокого ранга) спрашивается, есть ли 1, то есть 1∊мы можем записать наш поезд как 2×1∊=.
Обратите внимание, что ∊это правильный аргумент, поэтому вы не можете использовать его для уменьшения каждой строки или столбца в отдельности.
Используйте 1⊥вместо монадического +/или+⌿
Задача: учитывая список списков L и индекс N, вернуть трижды сумму N-го списка. Например L←(3 1 4)(2 7)и N←1дает 24.
Решение dfn может быть, N{3×+/⍺⊃⍵}Lно вы хотите сократить его, перейдя в молчание. N(3×+/⊃)Lне собирается работать, потому что правила формирования поезда разбирают это так, как 3(× +/ ⊃)вы хотите 3 × (+/⊃).
Заметьте, что вычисление списка чисел в унарном (base-1) эквивалентно суммированию списка, потому что ∑ { a , b , c , d } = a + b + c + d = ( a × 1³) + ( b × 1² ) + ( c × 1¹) + ( d × 1⁰). Поэтому так +/a b c dже, как 1⊥a b c dи мы можем написать наш поезд, как 3×1⊥⊃.
Обратите внимание, что для аргументов более высокого ранга 1⊥эквивалентно +⌿.
Использовать f.gвместо f/gскалярных и / или векторных аргументов
Задача: учитывая список L и число N, верните диапазон 1 до числа минимального остатка деления, когда элементы L делятся на NEg L←31 41 59и N←7дают 1 2 3.
Решение dfn может быть, N{⍳⌊/⍺|⍵}Lно вы хотите сократить его, перейдя в молчание. N(⍳⌊/|)Lне собирается работать, потому что правила формирования поезда разбирают это так, как ⍳ (⌊/) |вы хотите ⍳ (⌊/|).
Внутреннее произведение A f.g Bскалярных двух функций, когда аргументы являются скалярами и / или векторами, совпадает с тем, f/ A g Bчто оба они (A[1] g B[1]) f (A[2] g B[2]) f (A[3] g B[3])и т. Д., Поэтому мы можем записать наш поезд как ⍳⌊.|.
Обратите внимание, что это не работает для массивов более высокого ранга.
Используйте ∊⊆вместо /логических аргументов левый и простой векторный правый
Задача: учитывая список L и число N, отфильтруйте список так, чтобы остались только числа больше N. Например L←3 1 4и N←1дает 3 4.
Решение dfn может быть, N{(⍺<⍵)/⍵}Lно вы хотите сократить его, перейдя в молчание. N(</⊢)Lне будет работать, потому что правила привязки будут анализировать это как, (</) ⊢но вы хотите, /чтобы функция копировалась, а не уменьшала оператор .
Dyadic ⊆с логическим левым аргументом разбивает правый аргумент в соответствии с сериями 1 в левом аргументе, отбрасывая элементы, обозначенные 0. Это почти то, что мы хотим, за исключением нежелательных разделов. Тем не менее, мы можем избавиться от разбиения, применяя monadic ∊. Таким образом {(⍺<⍵)/⍵}может стать {∊(⍺<⍵)⊆⍵}и таким образом мы можем написать наш поезд как ∊<⊆⊢.
Обратите внимание, что это не работает для массивов более высокого ранга.
Использовать 0⊥вместо ⊢/или ⊢⌿с числовыми аргументами
Задача: Учитывая список L и число N, Умножить N с правым элементом Ноги L←3 1 4и N←2дает 8.
Решение dfn может быть, N{⍺×⊢/⍵}Lно вы хотите сократить его, перейдя в молчание. N(⊣×⊢/⊢)Lне собирается работать, потому что правила формирования поезда разбирают это так, как ⊣ (× ⊢/ ⊢)вы хотите ⊣ × (⊢/⊢).
Заметьте, что 0⊥числовой массив такой же, как ⊢⌿, поэтому мы можем записать наш поезд как ⊣×0⊥⊢.
Обратите внимание, что это выбирает последнюю главную ячейку массивов более высокого ранга.