Трюки для работы с поездами /
и ⌿
в поездах
При использовании поездов вы можете использовать сокращения, 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⊥⊢
.
Обратите внимание, что это выбирает последнюю главную ячейку массивов более высокого ранга.