Элементы a
: _1
или 1
.J: Число изменений знаков между пунктами списка
a =: 1 _1 _1 1 _1
Есть 3 знака изменения в a
:
1, -1, -1, 1, -1
Λ Λ Λ
here and here
Как подсчитать их looplessly?
Элементы a
: _1
или 1
.J: Число изменений знаков между пунктами списка
a =: 1 _1 _1 1 _1
Есть 3 знака изменения в a
:
1, -1, -1, 1, -1
Λ Λ Λ
here and here
Как подсчитать их looplessly?
сопряжении их с 2 v\
, проверьте, если они отличаются ~:/
и просуммировать +/
:
+/ 2 ~:/\ a
3
2 ~:/\ 1 1 1 _1 _1 _1 1 _1 1
0 0 1 0 0 1 1 1
+/2 ~:/\ 1 1 1 _1 _1 _1 1 _1 1
4
редактировать
Или вы могли бы выстраиваться Лишать }:
и обезглавить }.
из a
и сравнить их, но что заметно менее эффективно.
+/(}: ~: }.) a
если число может быть иным, чем 1 и _1,
2 ~:&*/\ _2 4 3 _1 _3 1
1 0 1 0 1
спасибо. Очень хорошая программа. –
Не могли бы вы объяснить, почему '+/@ (}: ~:}.)' Менее эффективен, чем '+/@ (2 & (~:/\))', пожалуйста? –
В основном потому, что '2 f/\ y' поддерживается [специальным кодом] (http://www.jsoftware.com/help/release/infix2a.htm). Другое дело, что обезглавливание дорого (как во времени, так и в пространстве). Требуется больше, чтобы просто обезглавить большой 'a', чем считать количество изменений знака первым. Вы можете сделать большой случайный 'a' (' a =: 1 _1 {~? 1e6 $ 2') и проверить его с помощью 'timespacex'. – Eelvex