Как я могу определить глагол в J, который попеременно применяет разные глаголы к каждому атому в списке? - PullRequest
2 голосов
/ 07 июня 2010

Представьте, что я определил следующее имя в J:

m =: >: i. 2 4 5

Это выглядит следующим образом:

1  2  3  4  5
 6  7  8  9 10
11 12 13 14 15
16 17 18 19 20

21 22 23 24 25
26 27 28 29 30
31 32 33 34 35
36 37 38 39 40

Я хочу создать монадический глагол ранга 1, который применяетсяк каждому списку в этом списке списков.Он удваивается (+:) или добавляет 1 (>:) к каждому альтернативному элементу в списке.Если бы мы применили этот глагол к первой строке, мы получили бы 2 3 6 5 10.

Довольно просто получить список логических значений, которые чередуются с каждым элементом, например, 0 1 $~{:$ m дает нам 0 1 0 1 0.Я подумал: ага! Я буду использовать что-то вроде +: `>: @. с последующим выражением, но я так и не смог заставить его работать.

Есть предложения?

ОБНОВЛЕНИЕ

Кажется, что работает следующее, но, возможно, J может превратить его в нечто более элегантное.

poop =: monad define
    (($ y) $ 0 1 $~{:$ y) ((]+:)`(]>:) @. [)"0 y
)

Ответы [ 3 ]

3 голосов
/ 12 июня 2010

Я бы использовал наклонный глагол с рангом 1 (/."1) - поэтому он применяется к последовательным элементам каждого списка по очереди.

Вы можете передать герунду в /., и он применяет их по порядку, расширяясь циклически.

   +:`>: /."1 m 
 2
 3
 6
 5
10

12
 8
16
10
20

22
13
26
15
30

32
18
36
20
40


42
23
46
25
50

52
28
56
30
60

62
33
66
35
70

72
38
76
40
80
1 голос
/ 17 января 2013

(, @ (+: `>: /.)" 1 a) работает, но учтите, что ((* 2 1 $ ~ $) @ (+ 0 1 $ ~ $) "1 a) также сработало бы (и примерно в 20 раз быстрее, на больших массивах, в моих кратких тестах).

1 голос
/ 16 сентября 2011

Я потратил много времени и посмотрел на него, и я уверен, что знаю, почему ,@ работает, чтобы восстановить форму аргумента.

Форма аргументов для фразы в скобках - это форма аргумента, переданного ей справа, даже если ранг изменяется конъюгатом " (ну, это то, что трасса назвала это, я думал было наречие). Если бы , было монадическим, это был бы равн, и результатом был бы вектор или по крайней мере более низкого ранга, чем входной, основанный на наречиях к равелю. Вот что произойдет, если вы удалите соединение - вы получите вектор.

Итак, я считаю, что происходит то, что соединение заставляет , вести себя как диадический ,, который называется добавлением. Добавление изменяет то, что оно добавляет к тому, что оно добавляет. Он не добавляет ничего, кроме того, что эта вещь все еще имеет форму, и поэтому он в конечном итоге изменяет промежуточный вектор обратно на форму входного сигнала.

Теперь я, наверное, ошибаюсь. Но $,"0@(+:>: /.) "1>: i. 2 4 5 -> 2 4 5 1 1`, что, на мой взгляд, доказало мою правоту.

...